【问题标题】:How to print only the first non-blank line using sed如何使用 sed 仅打印第一个非空行
【发布时间】:2015-07-16 09:24:36
【问题描述】:

给定以下文件,其中第 1 行为空白:

\n
Line 2\n
Line 3\n

如何使用 sed 仅输出“第 2 行”?

欢迎使用其他标准 UNIX 工具(例如 awk)的解决方案。

【问题讨论】:

    标签: shell unix awk sed text-parsing


    【解决方案1】:

    使用带有-m 开关的grep 版本,例如GNU 或OpenBSD grep:

    grep -m 1 . file
    

    这将在 1 个匹配行后停止读取文件。 . 匹配任何字符,因此第一个非空行将匹配。

    使用任何版本的 awk(与 sed 版本基本相同):

    awk '/./{print;exit}' file
    

    【讨论】:

    • awk 'NF{print;exit}' 也可以根据他们是否将空白视为空白来工作。
    • 非标准的-m 扩展已于 2017 年 12 月 9 日添加到 OpenBSD 的 grep(1) 中。很好。甚至比 sed 更简单。
    【解决方案2】:

    带 cmets 的多行版本

    sed -n '  # use -n option to suppress line echoing
      /./ {   # match non-blank lines and perform the enclosed functions
              # print the non-blank line, i.e., "Line 2"
              p
              # quit right after printing the first non-blank line
              q
          }
    ' file
    

    没有 cmets 的单行版本

    sed -n '/./{p;q;}' file
    

    【讨论】:

    • 我可能会说sed '/./q;d' file,但两者都可以。
    • @Wintermute,非常好。我没有意识到在退出之前会回显这条线。
    • 如果-n 选项没有提供给 sed,它会。 q 在这方面类似于 n。这种行为在这种情况下可以很好地使用,但老实说,它经常令人烦恼。 GNU sed 有一个 Q 命令,因为这个原因,无论 -n 是什么,它都会退出而不打印。
    【解决方案3】:

    如果您有一个空行,则示例有效,但如果您的行包含空格或制表符等字符,则示例无效。

    我认为即使“空白”行包含空格或制表符,这个版本也可以工作。

    sed '/[^[:blank:]]/q;d' 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2010-10-07
      • 2021-09-05
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多