【问题标题】:BSD sed ignores the leading spaces in the text for a\ commandBSD sed 忽略 a\ 命令文本中的前导空格
【发布时间】:2019-03-12 00:58:16
【问题描述】:

echo 命令中保留了前导空格。以这个脚本为例:

echo 'abc
    def'

输出:

$ sh foo.sh 
abc
    def

但是a\ 命令的sed 文本中的前导空格不会被macOS 附带的BSD sed 保留。拿这个脚本:

echo abc | sed '/abc/a\
    def
'

在 macOS 上使用 BSD sed 输出:

$ sh foo.sh 
abc
def

在 Linux 上使用 GNU sed 输出:

$ sh foo.sh
abc
    def

我能够在 macOS 上解决这个问题,并像这样保留前导空格:

echo abc | sed '/abc/a\
\ \ \ \ def
'

输出:

$ sh foo.sh 
abc
    def

对于POSIX documentation of sed 中指定的a\ 命令,忽略文本中前导空格的行为在哪里?

我在文档中找不到任何内容表明这种忽略 a\ 文本中前导空格的行为是正确的。你能在文档中看到任何说明这种行为是正确的吗?

【问题讨论】:

  • 看来你是对的。
  • POSIX sed 规范的问题恰恰在于它没有指定这一点,或者其他一些极端情况。
  • sed 的 macOS 手册页主要引用(或近似解释)POSIX 标准。它没有说明 text 项目中的前导空白是否重要。我不确定 POSIX 之前的先例是什么。 ISTR 认为行首的空白大多被忽略了,而 macOS 可能会延续这一传统。
  • sed 最适合s/old/new/仅此而已。对于其他任何事情,您都不应该使用 sed,因此它的各种风格在各种操作系统上做什么或不做什么并不重要。在这种情况下,请改用awk '{print} /abc/{print " def"}',它可以在任何 UNIX 机器上的任何 shell 中使用任何 awk 来稳健、便携、清晰、高效地等工作。

标签: shell sed posix whitespace


【解决方案1】:

看起来你是对的。就您所做的具体观察而言,您的sed 的行为将是不合格的。

确实,POSIX(正如您所链接的那样)说:

编辑除{...}abcirtw:@和@9876543之外的命令可以遵循由 、可选的 字符和另一个编辑命令组成。但是,当 s 编辑命令与 w 标志一起使用时,以这种方式跟在另一个命令之后会产生未定义的结果。

这似乎与 POSIX 解决问题一样接近,并且——通过从规定中排除 a 命令——它似乎承认了已经暗示的内容。似乎承认空白对a 很重要。

当然,我的回答并不完全是决定性的,但你似乎有足够的证据支持你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多