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.