用sed替换一行但保留原始行

时间:2013-12-19 12:39:01

标签: regex linux bash command-line sed

我有一句话:

param1='123'

我想要以下内容:

param1='123'
param2=123

123可以是任何值。

我可以使用param2获取:

sed -i "s/param1=\([0-9]\+\)/param2='\1'/g" '{}' \;

但是我会失去param1

我还可以使用

附加行param2
sed -i "param1='\([0-9]\+\)';/a \param2=\1;"

但该模式无法识别,我最终得到param2=1

有没有办法将这两个命令或其他工作方式结合起来?

4 个答案:

答案 0 :(得分:2)

-i标记添加扩展程序会创建备份,以便更新foo.ini并找到原始未经修改的版本foo.ini.bak

$ find . -name '*ini' -exec sed -ri.bak 's/param1=.([0-9]+)./&\nparam2=\1/' {} \;

sed命令中,g标志可能是多余的,因为在Unix配置文件中,单个选项设置在一行上。该命令将param1=123替换为param1=123\nparam2=123,因为&表示整个匹配,并且值123在第一个捕获组中被捕获。

&        # Whole match
\n       # Newline character
param2=  # Literal string
\1       # First capture group

所以基本上该行是重复的,但是选项被更改并且值保持不变。

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed "p;s/1='\([^']*\)'.*/2=\1/" file

答案 2 :(得分:1)

你可以说:

sed -r "s/(param1='([^']*)')/\1\nparam2=\2/" filename

(为就地编辑添加-i选项。)

答案 3 :(得分:-1)

sed -i "s/\(param1='\([0-9]\+\)'\)/\1\nparam2=\2/g"

似乎有效。

类似于devnull的回答,但是没有-r(在不使用扩展正则表达式时需要在括号之前添加反斜杠)。