使用“sed”替换最多一个单词(而不是一个字符)的任何内容

Ray*_*ews 2 sed text-processing regular-expression

我知道如何使用sedwith[^xxxx]语法来排除字符,但如何排除单词?例如我的变量:

var="
Now is the time
for all good men 
to come 
to the aid  
of the party" 
Run Code Online (Sandbox Code Playgroud)

现在:

echo $var | sed ...
Run Code Online (Sandbox Code Playgroud)

...我想最终得到:

REPLACED time
for all good men 
to come 
REPLACED aid  
REPLACED party 
Run Code Online (Sandbox Code Playgroud)

...这应该很简单,但我不知道该怎么做。

echo $var | sed -r 's/^[^the]*the/REPLACED/'
Run Code Online (Sandbox Code Playgroud)

... 有点接近,但它们t h e被匹配为单个字符,而不是单词the

如果有解决方案,我可以替换所有内容,直到多次出现的第一个,甚至直到一个特定的出现,那就更好了。

Adm*_*Bee 5

您可以按如下方式实现这一点,假设线路上最多有一个 的实例the

 sed -E 's/.*\Wthe(\W.*)/REPLACED\1/'
Run Code Online (Sandbox Code Playgroud)

这将用您的替换文本替换直到最后一次出现的所有内容(请记住,正则表达式是贪婪的)the

  • 它通过将最后一次出现后的所有内容存储在捕获组中the,并用非单词字符括起来(以防止部分单词匹配,例如theoretical),包括以 , 结尾的非单词字符来实现此目的。the( ... )
  • 然后,它将用替换文本替换该行,后跟捕获组的内容(之所以称为 ,是\1因为它是搜索模式中的第一个此类组)。这种稍微复杂的方法是必要的,以便终止 的字符the也被转移到替换文本。

如果您想替换第一次出现之前的所有内容,您可能必须求助于awk

awk '(i=match($0,/\Wthe\W/)){print "REPLACED" substr($0,i+4);next} 1'
Run Code Online (Sandbox Code Playgroud)

the这将检查由非单词字符包围的字符串 是否出现在该行上,并将位置存储在变量 中i

  • 如果i非零,它将打印替换文本和当前输入行的子字符串,出现后开始the,否则跳到下一行。
  • 如果i为零,它只是按原样打印当前行。