我读过几篇相关的文章,但我的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