2013-08-07 188 views
0

有誰知道如何替換模式,除非它匹配使用sed的某些特定模式?sed替換模式,除非它匹配某些特定模式

例如,所有的「foo」應該除了「food

+0

爲什麼它必須是'sed'?發佈一些示例輸入和期望的輸出,因爲這感覺很像這些問題中的一個,這些問題將通過一系列發佈的答案進行演變,然後是「哦,這不完全是我的意思」響應。 –

回答

0

我猜你沒有要求確切的詞語匹配,(有字的邊界)來代替。這很容易。我想你想要做字符串替換,如:

foofoofoodfoofood 

這裏是一個sed線,這可能會在這方面努力:

sed 's/food/\x99/g; s/foo/___/g; s/\x99/food/g' 

它取代foo___。但葉food,看到測試:

kent$ echo "foofoofoodfoofood"|sed 's/food/\x99/g; s/foo/___/g; s/\x99/food/g' 
______food___food 

如果你真正需要的單詞邊界的解決方案:

kent$ echo "foo foo food foo food"|sed 's/\bfoo\b/___/g'       
___ ___ food ___ food 
1

如果你打開替代的sed,Perl的環視斷言是有幫助的:

$ perl -E '$s="foofoofoodfoofood"; $s=~s/foo(?!d)/bar/g; say $s' 
barbarfoodbarfood 
2

這可能爲你工作(GNU SED):

sed -r ':a;s/foo([^d]|$)/xxx\1/;ta' file 

這取代foo和以下字符,除非它是d