使用sed有条件地匹配一个单词

我想要replace所有包含abc单词,但不要在abc之前包含KLM

例如, "dasdasKLMabc"不应该改变,但"dasabc"是很好的replace,我想用rrrreplaceabc

sed似乎不支持后台。 但是你可以用perl来做到这一点很简单:

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

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

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

要么

 sed 's/KLMabc/#####/g' -e 's/abc/rrr/g' -e 's/#####/KLMabc' <input_file> 

如果你可以使用ssed ,你可以使用Perl风格的lookbehind断言 :

 ssed -R 's/(?<!KLM)abc/rrr/g' input.txt 

例:

 $ echo "dasdasKLMabc dasabc" | ssed -R 's/(?<!KLM)abc/rrr/g' dasdasKLMabc dasrrr