【问题标题】:Strange sed output奇怪的 sed 输出
【发布时间】:2014-12-27 21:42:12
【问题描述】:

以下带有 sed 和简单正则表达式的命令:

echo 'Atest Atest Atest' | sed -E 's/A|$/B/g'

产生输出:

Btest Btest B

请有人解释一下,为什么 sed 吃掉最后一个字?我希望输出是这样的:

Btest Btest BtestB

我使用与 Mac OS 捆绑在一起的 sed 版本(“BSD-flavour”)。

更新 与 GNU sed 相比,这种行为看起来像一个错误,所以我选择坚持后者。

【问题讨论】:

  • sed (GNU sed) 4.2.2 上对我来说很好。
  • 我的 sed (4.2.2) 返回你所期望的。它在windows中cygwin下的zsh中
  • 为我工作。 sed 4.2.1 也可以按您的预期工作。

标签: regex macos bash sed


【解决方案1】:

有趣的是,这似乎是 OSX 上可用的 BSD sed 中的一些错误(奇怪的行为)。我可以重现这种行为。看起来这种行为只发生在 g 标志上。

要解决这个问题,我建议使用这个等效的sed 命令:

echo 'Atest Atest Atest' | sed 's/A/B/g;s/$/B/'
Btest Btest BtestB

【讨论】:

  • “sed 不断用 B 替换每个 $”是什么意思?
  • echo 'foo' | sed -E 's/f|$/B/' 变为 booecho 'foo' | sed -E 's/f|$/B/g' 在 OSX sed 上变为 B
  • 另一个奇怪的行为:echo 'foo' | sed -E 's/^|$/B/g' 变成 Bfoo 而不是 BfooB
  • 有趣。 echo 'foo' | sed -E 's/$/B/' 怎么样(有和没有 g 标志)?
  • 是的,我同意,看起来像一个错误。但对我来说实际的解决方法是通过 Homebrew 安装 gnu-sed :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2015-02-18
  • 2011-06-14
  • 2013-06-04
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多