sed替换模式,除非它匹配某些特定模式

时间:2013-08-07 09:40:08

标签: shell sed matching

有人知道如何替换模式,除非它使用sed匹配某些特定模式吗?

例如,除了“foo”之外,所有“food”都应该被替换

3 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

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

除非是foo,否则会替换d和以下字符。

答案 1 :(得分:1)

如果您对sed的替代方案持开放态度,perl的外观断言很有帮助:

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

答案 2 :(得分: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