【问题标题】:How to mach a string when not followed by another with sed如何在没有后跟另一个字符串时使用sed匹配一个字符串
【发布时间】:2013-03-01 23:24:46
【问题描述】:

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

'foo       boo      foo 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 部分有固定空格?
  • 分隔符包含可变数量的空格(但仅限空格)。 sed 不是必须的,只要我可以用其他东西替换匹配的匹配项,但不修改空格字符分布。

标签: sed


【解决方案1】:

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

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

例如,这行有效:

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

【讨论】:

  • 一年!非常感谢 :) 你找到了我解决方案的确切问题。
  • 好吧,我不知道你为什么选择 x94 和 x98,但似乎可以使用从 x80 到 xFF 的所有字符,属于扩展 ASCII 表的字符。再次感谢:-)
  • @taalf 没有特别的原因,因为我在 9 之后按了 4 和 8。:)
猜你喜欢
  • 2021-08-17
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多