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