匹配之间的所有内容评论:下一个;或者行结束并将其替换为单词酒吧
s="/home/user/14.JPG;comment:foo;sometag;sort:30"
sed "s/comment:(\w+)/\bar/g" <<< $s
退货
/home/user/14.JPG;comment:foo;sometag;sort:30
代替
/home/user/14.JPG;comment:bar;sometag;sort:30
我究竟做错了什么?
答案1
首先,您尝试使用扩展正则表达式 (ERE),但 Sed 默认使用基本正则表达式 (BRE)。即,()
对于分组和+
对于“一个或多个”来说是ERE。欲了解更多详细信息,请阅读为什么我的正则表达式在 X 中有效但在 Y 中无效?。要激活 ERE,请使用该-E
标志(但我们的解决方案不需要它)。
即使这样还不够,因为你也在匹配comment:(\w+)
,但是
- 你不用重新介绍
comment:
。将其放入替换槽中。 - 作为
\w
GNU 扩展匹配单词字符,(\w+)
并不;
像问题所声称的那样“一切都到下一个”,那就是[^;]*
。
解决办法是
sed 's/comment:[^;]*/comment:bar/g'
答案2
您可以使用组并通过 numbing 调用,通过分组将 yyy 替换为 xxx :
$ echo "foo yyy bar" | sed 's/\(foo\).*\( bar\)/\1 xxx \2/'
foo xxx bar
在你的情况下:
sed "s/\(comment:\).*\(sometag\)/\1bar\2/g" <<< $s