是否有人知道如何匹配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'实例原版......(我希望我很清楚......)
但无论如何这根本不干净。我会感到惊讶的是,即使我到目前为止还没有找到它,也没有更直接的方法。
任何暗示都将受到赞赏。 : - )
非常感谢,
答案 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