Ray*_*ews 2 sed text-processing regular-expression
我知道如何使用sed
with[^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
。
如果有解决方案,我可以替换所有内容,直到多次出现的第一个,甚至直到一个特定的出现,那就更好了。
您可以按如下方式实现这一点,假设线路上最多有一个 的实例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
为零,它只是按原样打印当前行。