2016-07-27 67 views
1

什么是以下R函数的bash等价物?在Bash中粘贴带有数组的单个字符串

vec=4:9 
out=paste0("foo_",vec,"_bar") 
out 

"foo_4_bar" "foo_5_bar" "foo_6_bar" "foo_7_bar" "foo_8_bar" "foo_9_bar" 
+0

是'vec = 4:9'只是一个例子(其中输入可能真的是任何数组),还是真的是它总是生成为两个常量之间的范围? –

+0

只是一个例子 –

+0

'echo foo_ {4..9} _bar'? – twalberg

回答

3

您可以使用后缀,前缀声明数组,然后用括号展开来填充递增的数字:

arr=("foo_" "_bar") # array with suffix and prefix 
echo "${arr[0]}"{4..9}"${arr[1]}" # brace expansion 

foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar 
+0

嗯。我的意思是,这是有效的,但它只适用于一个非常特殊的场景(数组通过大括号扩展生成),而不是任何任意数组。 –

+0

@CharlesDuffy:当这不起作用? – sjsam

+1

@sjsam,...当数组中的前缀和后缀连接起来时(R中的'4:9')是由常数锚定的数字范围以外的数组。关于问题的评论,请参阅OP的讨论,即以这种方式限制问题域不是他们的意图。 –

2

你可以用括号展开:

$ echo foo_{4..9}_bar 
foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar 
$ out=(foo_{4..9}_bar) 
$ echo "${out[1]}" 
foo_5_bar 
2

这个工程即使如果您的vec不是通过支架扩展生成的:

vec=({4..9}) # would work even with vec=(*.txt) or readarray -t vec <file, etc. 
out=("${vec[@]/#/foo_}") # add foo_ prefix 
out=("${out[@]/%/_bar}") # add _bar suffix 
declare -p out # print resulting array definition 

请参阅bash-hackers wiki上的the Parameter Expansion page,特别是“Search and Replace”下的“Anchoring”部分。

相关问题