用 sed 替换单词、字符或行尾之间的匹配

用 sed 替换单词、字符或行尾之间的匹配

匹配之间的所有内容评论:下一个;或者行结束并将其替换为单词酒吧

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:。将其放入替换槽中。
  • 作为\wGNU 扩展匹配单词字符,(\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

相关内容