我有一句话:
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
有没有办法将这两个命令或其他工作方式结合起来?
答案 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(在不使用扩展正则表达式时需要在括号之前添加反斜杠)。