2013-03-14 52 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