sed -\n\nnd应该怎么做?

标签 sed

echo n | sed '\n\nnd'
使用GNU sed,以上命令将输出n。相反,BSD sed不打印任何内容。
POSIX sed spec.说:
  • 在上下文地址中,构造\cBREc(其中c以外的任何字符)应与/BRE/相同。如果由c指定的字符出现在<反斜杠>之后,则应将其视为该文字字符,该字符不得终止BRE。例如,在上下文地址\xabc\xdefx中,第二个x代表自己,因此BRE为abcxdef
  • 转义序列\n必须与模式空间中嵌入的相匹配。文字不得在上下文地址的BRE中或在替代函数中使用。

  • 但没有详细说明这些陈述所引入的矛盾。
    我的问题是,哪个是正确的行为?打印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/

    相关文章:

    linux - bash 脚本运行每个文件夹

    linux - 如何使用 Shell 脚本解析报告?

    awk - 使用 sed 或 awk 删除倒数第三行文件

    regex - 具有相同起始位置的相同长度正则表达式替代方案的决胜局

    regex - sed中的“-n”实际上是什么意思?

    regex - Linux sed - 删除不以特定字符开头的单词

    bash - 将数据从一个来源迁移到另一个来源的脚本

    sed:从文件中删除字母数字单词

    ubuntu - sed 无法从文件中删除

    sed - 删除包含两个点的行,点之间有字符