2

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

比如"dasdasKLMabc"不应该改,但是"dasabc"好替换,我想替换abcrrr

4

3 回答 3

3

sed 似乎不支持后视。但是你可以在 perl 中相当容易地做到这一点:

sorin@sorin:~$ echo -e "llalaabc\nKLMabc" | perl -pe 's/(?<!KLM)abc/rrr/'
llalarrr
KLMabc
sorin@sorin:~$
于 2013-03-14T11:56:00.813 回答
2

据我所知,GNU sed 不支持前瞻和后瞻。解决您的问题的一种简单方法是KLMabc用一些“唯一”字符串替换,替换所有abcs 然后将唯一字符串替换回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>
于 2013-03-14T11:48:38.303 回答
1

如果你可以使用ssed,你就可以使用 Perl 风格的后向断言

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

例子:

$ echo "dasdasKLMabc dasabc" | ssed -R 's/(?<!KLM)abc/rrr/g'
dasdasKLMabc dasrrr
于 2013-03-14T11:50:38.510 回答