sed:引号之间的匹配,仅限于第一个实例



我读过几篇相关的文章,但我的sed字符串还没有弄好。如何找到包含myVariable="something"的第一行,并将引号之间的内容更改为某个变量(这是在shell脚本中)?

我试过:

sed -i '/myVariable/s/"([^"]*)"/"${1}"/' /file

但这在myVariable="的所有实例中插入了$1。

如果我像其他帖子建议的那样,在命令之前加上"0",那么它就不再与"myVariable"匹配。相反,它会替换每行中的第一个引号实例。

后续问题:如果我想将一个变量与其中的一个空格匹配,会有什么不同吗?如果我想替换myVariable="的第n个实例,该怎么办?

示例file.txt:

<blah myVariable="this" />
<blah myVariable="that" />
<blah myVariable="the other thing" />

如果我把苹果递给:

sed -i '/myVariable/s/"([^"]*)"/"'"${1}"'"/' /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/"([^"]*)"/"${1}"/' /file

但这给了我类似的东西:

<foo bar="${1}" />
<blah myVariable="${1}" />
<blah myVariable="${1}" />
<blah myVariable="${1}" />
<alpha bravo="${1}" charlie="notchanged"/>

注意:我不在乎$1,它可以通过正确转义来更改。我更担心的是,我现在没有更改myVariable的第一个实例,而是在每一行上更改了"的第一个例子(与myVariable无关)。

只需使用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//$1="apple"/ if ++$i==1 }' -i a.txt

无论引号对中是否有空格,这都会起作用。仅对于第n个正则表达式匹配,将++$i==1中的1替换为n。

插入和退出单引号

sed -i '/myVariable/s/"([^"]*)"/"'"${1}"'"/' /file

相关内容

  • 没有找到相关文章

最新更新