我有一个数组,如下所示:
snakes=(python boa cornsnake milksnake)
我想知道是否可以使用sed替换整个数组的模式。 我在考虑这样的事情:
sed -i "s/snakes like/& $(echo ${snakes[@]})/g" snakes.txt
并将此处的输出分隔为,
:
snakes like python, boa, cornsnake, milksnake
非常感谢任何想法或建议。
答案 0 :(得分:3)
您可以通过正确扩展阵列来实现这一目标。
假设您要编辑一个名为languages的文件(蛇是粗略的):
$ cat languages
I like languages like.
你的阵列是这样的:
$ langs=(python perl ruby lua)
你必须
IFS=,
(内部字段分隔符)${langs[*]}
#
,如正则表达式中的^
,带有空格最后一个命令就是这个:
$ IFS=, ; sed -i "s|languages like|&${langs[*]/#/ }|" languages
(为了清楚起见,我在sed命令中使用了|
,但是/
也没关系,因为
你的shell在传递之前将${langs[*]/#/ }
转换为最终字符串
它来sed)
语言文件现在如下所示:
I like languages like python, perl, ruby, lua.
答案 1 :(得分:1)
使用此数组的定义:
$ snakes=(python boa cornsnake milksnake)
我们需要两个步骤。第一个是创建一个字符串s
,它将包含以逗号和空格分隔的数组snakes
的元素:
$ printf -v s ', %s' "${snakes[@]}"
然后,在s
命令中使用sed
:
$ sed -i "s/snakes like/& ${s:2}/g" snakes.txt
${s:2}
用于消除s
开头出现的额外逗号空间。
考虑这个示例文件:
$ cat snakes.txt
I like snakes like.
I don't like snakes.
申请sed
:
$ sed -i "s/snakes like/& ${s:2}/g" snakes.txt
该文件现在包含:
$ cat snakes.txt
I like snakes like python, boa, cornsnake, milksnake.
I don't like snakes.