Regex 用sed替换一行,但保留原始行
我有这样一句话:Regex 用sed替换一行,但保留原始行,regex,linux,bash,command-line,sed,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 有没有一种方法可以将这两
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
有没有一种方法可以将这两个命令结合起来,或者用另一种方法来实现这一点?您可以说:
sed -r "s/(param1='([^']*)')/\1\nparam2=\2/" filename
(为就地编辑添加-i
选项。)您可以说:
sed -r "s/(param1='([^']*)')/\1\nparam2=\2/" filename
(为就地编辑添加
-i
选项。)对-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
因此,基本上该行是重复的,但选项已更改,值保持不变 对
-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
因此,基本上该行是重复的,但选项已更改,值保持不变 这可能适合您(GNU-sed):
这可能适用于您(GNU-sed):
sed-i“s/\(param1='\([0-9]\+\)\)/\1\nparam2=\2/g“
似乎有效
与devnull的回答类似,但在没有-r的情况下也可以工作(不使用扩展regexp时需要在括号前添加反斜杠)。sed-i“s/\(param1='\([0-9]\+\)'\)/\1\nparam2=\2/g“
似乎有效
与devnull的回答类似,但在没有-r的情况下也可以工作(不使用扩展regexp时需要在括号前添加反斜杠)。通常最好将
sed
内联脚本用单引号括起来。这样,您就不必担心是否与shell处理cmd行有任何交互。如果需要传入shell变量并对其进行扩展(同样,作为一般规则,但不是硬性规则),则仅对sed内联脚本使用dbl引号。祝你好运,谢谢你。我使用双引号是因为我不希望单引号干扰123周围的单引号。也许我可以用“123”逃走对不起,我错过了你的模式。我认为“…\'123\'…”
不起作用。但是您可以将各种引用方法连接起来,例如,“…”“'123”“…”
。祝你好运。通常最好将sed
内联脚本用单引号括起来。这样,您就不必担心是否与shell处理cmd行有任何交互。如果需要传入shell变量并对其进行扩展(同样,作为一般规则,但不是硬性规则),则仅对sed内联脚本使用dbl引号。祝你好运,谢谢你。我使用双引号是因为我不希望单引号干扰123周围的单引号。也许我可以用“123”逃走对不起,我错过了你的模式。我认为“…\'123\'…”
不起作用。但是您可以将各种引用方法连接起来,例如,“…”“'123”“…”
。祝你好运。谢谢你的回答,我马上就来试试。请注意,我并不是说param2中有单引号,这会改变你的答案吗?我编辑了这本书question@user1792403我错了,我以为这是你的疏忽。我已经更新了我的答案来反映这一点。这似乎有点复杂,而且我对sed还很陌生。但是+1因为它看起来很令人兴奋,当我更好地理解事情时,我会回来看这个谢谢你的回答,我会马上尝试。请注意,我并不是说param2中有单引号,这会改变你的答案吗?我编辑了这本书question@user1792403我错了,我以为这是你的疏忽。我已经更新了我的答案来反映这一点。这似乎有点复杂,而且我对sed还很陌生。但是+1,因为它看起来很令人兴奋,当我更好地理解事情时,我会回来看看这一点,这适用于-r
选项,但我得到了这个错误sed:-e expression\1,char 35:s命令的RHS上的无效引用\2,如果我将-r
更改为-i
或-e
这适用于-r
选项,但是如果我将-r
更改为-i
或-e
时,我会得到这个错误sed:-e表达式1,char 35:'s'命令的RHS
上的无效引用\2