【发布时间】: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