Linux 使用sed有条件地匹配单词

Linux 使用sed有条件地匹配单词,linux,bash,sed,Linux,Bash,Sed,我想替换在abc之前包含abc但不包含KLM的所有单词 例如,“dasdasKLMabc”不应该被更改,但是“dasabc”很适合替换,我想用rrr替换abc据我所知,GNU sed不支持向前看和向后看。解决问题的一个简单方法是用一些“唯一”字符串替换KLMabc,替换所有abcs,然后用KLMabcs替换唯一字符串 sed 's/KLMabc/#####/g' <input_file> | sed 's/abc/rrr/g' | sed 's/#####/KLMabc' sed'

我想替换在
abc
之前包含
abc
但不包含
KLM
的所有单词


例如,
“dasdasKLMabc”
不应该被更改,但是
“dasabc”
很适合替换,我想用
rrr
替换
abc

据我所知,GNU sed不支持向前看和向后看。解决问题的一个简单方法是用一些“唯一”字符串替换
KLMabc
,替换所有
abc
s,然后用
KLMabc
s替换唯一字符串

sed 's/KLMabc/#####/g' <input_file> | sed 's/abc/rrr/g' | sed 's/#####/KLMabc'
sed's/KLMabc/#######/g';sed's/abc/rrr/g';sed's/#######/KLMabc's

sed's/KLMabc/#####/g'-e's/abc/rrr/g'-e's/#####/KLMabc's
如果可以使用,则可以使用Perl样式:


ssed-R的/(?sed似乎不支持向后看。但是您可以用perl非常简单地完成这项工作:

sorin@sorin:~$ echo -e "llalaabc\nKLMabc" | perl -pe 's/(?<!KLM)abc/rrr/'
llalarrr
KLMabc
sorin@sorin:~$

sorin@sorin:~$echo-e“llalaabc\nKLMabc”| perl-pe的/(?使用
\n
而不是冒险猜测“唯一”字符串,因为该字符串永远不会出现在模式空间中(除非用户添加)。
ssed -R 's/(?<!KLM)abc/rrr/g' input.txt
$ echo "dasdasKLMabc dasabc" | ssed -R 's/(?<!KLM)abc/rrr/g'
dasdasKLMabc dasrrr
sorin@sorin:~$ echo -e "llalaabc\nKLMabc" | perl -pe 's/(?<!KLM)abc/rrr/'
llalarrr
KLMabc
sorin@sorin:~$