sed:引号之间的匹配,仅限第一个实例
sed: match between quotes, first instance only
我已经阅读了几篇相关的文章,但我还没有得到正确的 sed 字符串。如何找到包含 myVariable="something" 的第一行,并将引号之间的内容更改为某个变量(这是在 shell 脚本中)?
我试过:
sed -i '/myVariable/s/"\([^"]*\)"/""/' /file
但这会将 $1 插入到 myVariable="" 的所有实例中。
如果我像其他帖子建议的那样在命令前加上“0”,那么它就不再匹配 "myVariable" 的行。相反,它会替换每一行的第一个引号实例。
后续问题:如果我想匹配一个带有 space 的变量,会有什么不同吗?如果我想替换 myVariable="" 的第 n 个实例怎么办?
示例file.txt:
<blah myVariable="this" />
<blah myVariable="that" />
<blah myVariable="the other thing" />
如果我将苹果传递给:
sed -i '/myVariable/s/"\([^"]*\)"/"'""'"/' /file.txt
file.txt 变为:
<blah myVariable="apple" />
<blah myVariable="apple" />
<blah myVariable="apple" />
但我想要:
<blah myVariable="apple" />
<blah myVariable="that" />
<blah myVariable="the other thing" />
编辑 2:
我试过了
sed -i -e '0,/myVariable/s/"\([^"]*\)"/""/' /file
但这给了我类似的东西:
<foo bar="" />
<blah myVariable="" />
<blah myVariable="" />
<blah myVariable="" />
<alpha bravo="" charlie="notchanged"/>
注意:我不关心$1,可以通过正确转义来改变。我更担心的是,我没有更改 myVariable 的第一个实例,而是在每一行上更改了“”的第一个实例(不管 myVariable 是什么)。
插入和取出单引号
sed -i '/myVariable/s/"\([^"]*\)"/"'""'"/' /file
只需使用 awk:
$ awk -v new="apple" '!f && sub(/myVariable="[^"]+/,"myVariable=\""new){f=1} 1' file
<blah myVariable="apple" />
<blah myVariable="that" />
<blah myVariable="the other thing" />
这就是我们如何使用 Perl 做到这一点:
perl -pe 'if (/(myVariable)="[^"]*"/) { s//="apple"/ if ++$i==1 }' -i a.txt
无论引号对中是否有空格,这都有效。
对于第 n 个正则表达式匹配,将 ++$i==1
中的 1
替换为 n.
我已经阅读了几篇相关的文章,但我还没有得到正确的 sed 字符串。如何找到包含 myVariable="something" 的第一行,并将引号之间的内容更改为某个变量(这是在 shell 脚本中)?
我试过:
sed -i '/myVariable/s/"\([^"]*\)"/""/' /file
但这会将 $1 插入到 myVariable="" 的所有实例中。
如果我像其他帖子建议的那样在命令前加上“0”,那么它就不再匹配 "myVariable" 的行。相反,它会替换每一行的第一个引号实例。
后续问题:如果我想匹配一个带有 space 的变量,会有什么不同吗?如果我想替换 myVariable="" 的第 n 个实例怎么办?
示例file.txt:
<blah myVariable="this" />
<blah myVariable="that" />
<blah myVariable="the other thing" />
如果我将苹果传递给:
sed -i '/myVariable/s/"\([^"]*\)"/"'""'"/' /file.txt
file.txt 变为:
<blah myVariable="apple" />
<blah myVariable="apple" />
<blah myVariable="apple" />
但我想要:
<blah myVariable="apple" />
<blah myVariable="that" />
<blah myVariable="the other thing" />
编辑 2:
我试过了
sed -i -e '0,/myVariable/s/"\([^"]*\)"/""/' /file
但这给了我类似的东西:
<foo bar="" />
<blah myVariable="" />
<blah myVariable="" />
<blah myVariable="" />
<alpha bravo="" charlie="notchanged"/>
注意:我不关心$1,可以通过正确转义来改变。我更担心的是,我没有更改 myVariable 的第一个实例,而是在每一行上更改了“”的第一个实例(不管 myVariable 是什么)。
插入和取出单引号
sed -i '/myVariable/s/"\([^"]*\)"/"'""'"/' /file
只需使用 awk:
$ awk -v new="apple" '!f && sub(/myVariable="[^"]+/,"myVariable=\""new){f=1} 1' file
<blah myVariable="apple" />
<blah myVariable="that" />
<blah myVariable="the other thing" />
这就是我们如何使用 Perl 做到这一点:
perl -pe 'if (/(myVariable)="[^"]*"/) { s//="apple"/ if ++$i==1 }' -i a.txt
无论引号对中是否有空格,这都有效。
对于第 n 个正则表达式匹配,将 ++$i==1
中的 1
替换为 n.