如何匹配一个字符串,而不是另一个字符串与sed

时间:2013-03-01 14:52:21

标签: sed

是否有人知道如何匹配sed每个'foo'实例除外,当它跟随以下字符串中的'bar'时?

  

'foo boo foo   foo bar foo   FOO   富'

期望的结果(以粗体显示的匹配实例)

  

' MaTcHeD 嘘    MaTcHeD foo   吧 MaTcHeD    MaTcHeD MaTcHeD '

经过大量测试后,我发现:

sed -e "s/foo\( *\)bar/FOO\1BAR/g" -e "s/foo/MaTcHeD/g" -e "s/FOO\( *\)BAR/foo\1bar/g"

它包括首先匹配'foo bar'实例并用一些临时字符串替换它们(这里是'FOO BAR'),然后匹配休息'foo'实例,然后将'foo bar'替换为'foo bar'实例原版......(我希望我很清楚......)

但无论如何这根本不干净。我会感到惊讶的是,即使我到目前为止还没有找到它,也没有更直接的方法。

任何暗示都将受到赞赏。 : - )

非常感谢,

1 个答案:

答案 0 :(得分:0)

如果你必须坚持sed,你的想法就可以了。但是,如果原始字符串具有FOO BAR,则您的解决方案将失败。您必须始终选择正确的临时字符串。它会使你的脚本不安全。

你可以通过不选择常规字符串作为临时字符串来改进它,但是那些不可见字符串。

例如,此行有效:

sed -r 's/foo( *)bar/\x94\1\x98/g; s/foo/Matched/g;s/\x94( *)\x98/foo\1bar/g' file