如何从替换中排除匹配字符串的一部分?

时间:2020-04-01 15:22:13

标签: sed

假设我要更改所有以-et结尾的单词,以使它们改为以-ert结尾

仅需执行简单的sed 's/et /ert /g'就可以对所有单词然后是另一个单词起作用。但仅当其后跟空格时。也可以在其后跟'。',',',':'或其他字符。对于每种情况运行sed似乎不是正确的方法。

我要寻找的是“对于AB的每一次匹配,都将A替换为C,但不要碰B”。

由于评论而澄清:

不仅限于单词的结尾。我也想在里面做这个。喜欢:

$ echo "aaetxaa" | sed '?'
aaertxaa
$ echo "aaetyaa" | sed '?'
aaetyaa

因此,仅当匹配以x而不是y结尾时才进行替换。

1 个答案:

答案 0 :(得分:2)

我假设仅当et后跟x或字符串结尾时,您才想匹配{}。

在这种情况下,您可以使用

sed -E 's/et(x|$)/ert\1/g'

请参见online sed demo

echo "aaetxaa" | sed -E 's/et(x|$)/ert\1/g'
# => aaertxaa
echo "aaetyaa" | sed -E 's/et(x|$)/ert\1/g'
# => aaetyaa

详细信息

  • -E-启用POSIX ERE语法
  • s/-替换命令,/是定界符
  • et(x|$)-LHS:et后跟x或捕获到第1组的字符串结尾
  • ert\1-ert和组1的值
  • g-全局标志:匹配并替换一行中的所有匹配项。