2013-03-14 49 views
2

我想要替换abc但不包含KLM之前abc之前的所有单词。使用sed条件匹配单词

例如,"dasdasKLMabc"不应该改变,但"dasabc"是很好的替换,我想用rrr替换abc

回答

2

就我所知,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> 
+0

不是危险在“独一无二”的字符串使用'猜测\ N'的(除非用户添加)此字符串将永远不会出现在模式空间。 – potong 2013-03-15 12:23:04

1

更换唯一的字符串回来,如果你能使用ssed,你就可以使用Perl样式的lookbehind assertion

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

举例:

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