2013-08-07 140 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