我想要replace所有包含abc
单词,但不要在abc
之前包含KLM
。
例如, "dasdasKLMabc"
不应该改变,但"dasabc"
是很好的replace,我想用rrr
replaceabc
。
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