正则表达式查找/替换在第一个单词后停止

时间:2018-08-30 13:38:31

标签: regex shell

如果将\ g设置为global,为什么字符串中只有“ the”之一被替换?

sed -E 's/(^|_)(the|an|is)(_|$)/\1/g' <<< "the_the_river"
= the_river

1 个答案:

答案 0 :(得分:1)

如上所述,问题是后面的_被消耗了。为避免重叠的匹配,您需要lookaroundsword boundaries。不能使用\<\>或某些版本\b之类的单词边界,因为下划线属于单词字符

替代项可以是使用支持环视的PCRE的perl one-liner

perl -pe 's/(?<![^_])(?:the|an|is)(?:_|$)//g' <<< "the_the_river"
  

  • (?<![^_])是一个否定的后缀,用于检查单词之前是否没有任何字符besides下划线。它在开始或下划线之前的任意位置匹配。
  • (?:the|an|is)non-capturing group alternating的不同词。
  • (?:_|$)假设您要删除(使用)单词后的下划线。

See regex101 for testing the pattern