Sed 当一根弦后面没有另一根弦时,如何处理它

Sed 当一根弦后面没有另一根弦时,如何处理它,sed,Sed,是否有人知道如何匹配每个“foo”实例,除非它在下面的字符串中后跟“bar” “foo boo foo 福吧福 福 富 所需结果(以粗体显示的匹配实例) “匹配boo 匹配foo 条匹配 匹配匹配' 经过大量测试,我发现: 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 boo foo 福吧福 福 富

所需结果(以粗体显示的匹配实例)

匹配boo 匹配foo 条匹配 匹配匹配'

经过大量测试,我发现:

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”实例。。。(我希望我很清楚……)

但无论如何,这一点都不干净。我会感到惊讶的是,没有一个更直接的方法来做这件事,即使到目前为止我还没有找到它

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


非常感谢,

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

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

例如,这一行可以工作:

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

字符串是否具有常规分隔符?e、 空间还是标签?我的意思是,
foo-bar
部分有固定的空格?分隔符包含在可变数量的空格中(但仅限于空格)。Sed不是必须的,只要我可以用其他东西替换匹配的匹配项,但不修改空格字符分布。年!非常感谢:)您找到了我的解决方案的确切问题。我不知道您为什么选择x94和x98,但似乎可以使用从x80到xFF的所有字符,这些字符属于扩展ASCII表。再次感谢:-)@taalf没有特别的原因,因为我按了4和8。9点以后。:)