echo n | sed '\n\nnd'
使用GNU sed,以上命令将输出n
。相反,BSD sed不打印任何内容。POSIX sed spec.说:
\cBREc
(其中c
是/BRE/
相同。如果由c
指定的字符出现在<反斜杠>之后,则应将其视为该文字字符,该字符不得终止BRE。例如,在上下文地址\xabc\xdefx
中,第二个x
代表自己,因此BRE为abcxdef
。\n
必须与模式空间中嵌入的但没有详细说明这些陈述所引入的矛盾。
我的问题是,哪个是正确的行为?打印
n
还是什么都不打印?还是选择权留给开发人员?显然,GNU sed对
\n
的处理与其他转义序列不同:$ echo t | sed 'st\ttt' | xxd
00000000: 0a .
$
$ echo n | sed 'sn\nnn' | xxd
00000000: 6e0a n.
最佳答案
根据Geoff Clare's response(在下面引用),结论是标准尚不明确,并且两种行为都是正确的。 HP-UX和Solaris采用与GNU相同的做法,因此这不是实现中的错误,但标准缺乏明确性。
哪一个都不比另一个更正确,因为正如您自己说的那样,标准尚不清楚。正式的解释是:“标准在这个问题上尚不清楚,因此不能在基于此的替代实现之间进行一致性区分。”
鉴于实现方式不同,我们可能应该明确取消指定行为。
如果在错误跟踪器中出现了将标准更新为明确声明未指定的建议,那么我将对其进行编辑以添加指向该标准的链接。
关于sed -\n\nnd应该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60853746/