如何使用sed替换整个数组的模式?

时间:2014-12-16 06:52:56

标签: arrays regex linux bash set

我有一个数组,如下所示:

snakes=(python boa cornsnake milksnake)

我想知道是否可以使用sed替换整个数组的模式。 我在考虑这样的事情:

sed -i "s/snakes like/& $(echo ${snakes[@]})/g" snakes.txt

并将此处的输出分隔为,

snakes like python, boa, cornsnake, milksnake

非常感谢任何想法或建议。

2 个答案:

答案 0 :(得分:3)

您可以通过正确扩展阵列来实现这一目标。

假设您要编辑一个名为languages的文件(蛇是粗略的):

$ cat languages
I like languages like.

你的阵列是这样的:

$ langs=(python perl ruby lua)

你必须

  • 设置IFS=,(内部字段分隔符)
  • 使用${langs[*]}
  • 将数组的所有元素转换为单个字符串
  • 通过替换每个空格的开头,在每个空格之前添加一个空格 字符串(bash中的#,如正则表达式中的^,带有空格

最后一个命令就是这个:

$ 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.