1

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

'foo boo foo foo bar foo foo foo'

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

'匹配       嘘声      匹配    foo bar匹配     匹配          匹配'

经过大量测试,我发现:

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 bar”实例“返回”到其原始版本之前匹配其余的“foo”实例。 ..(我希望我很清楚......)

但无论如何,这根本不干净。我会很惊讶没有更直接的方法可以做到这一点,即使到目前为止我还没有找到它。

任何提示将不胜感激。:-)

非常感谢你,

4

1 回答 1

0

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

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

例如,这条线有效:

sed -r 's/foo( *)bar/\x94\1\x98/g; s/foo/Matched/g;s/\x94( *)\x98/foo\1bar/g' file
于 2013-03-01T15:24:46.933 回答