【问题标题】:removing empty lines from a pipe using sed使用 sed 从管道中删除空行
【发布时间】:2017-03-27 17:30:46
【问题描述】:
$ find ~/AppData/Local/atom/ -name atom.sh -type f | grep -FzZ 'cli/atom.sh' | sed '/^\s*$/d' | cat -n
     1  /c/Users/devuser/AppData/Local/atom/app-1.12.1/resources/cli/atom.sh
     2  /c/Users/devuser/AppData/Local/atom/app-1.12.2/resources/cli/atom.sh
     3

我尝试了一些sed/awk-based options 来摆脱空白行。 (#3 在输出中)。但我不能完全正确...

我需要将最后一行放入变量中...

我正在使用的以下实际命令无法给出输出...

 find ~/AppData/Local/atom/ -name atom.sh -type f | grep -FzZ 'cli/atom.sh' | sed '/^$/d' | tail -n 1

【问题讨论】:

  • 好吧,这是一种肮脏的方式,但是反向排序和head -n 1的组合暂时解决了问题......

标签: linux bash unix git-bash


【解决方案1】:

下面的 sed 命令将删除所有空行。

sed '/^$/d' file

下面的 sed 命令将删除所有空行以及只有空格的行。

sed '/^[[:blank:]]*$/d' file

添加-i 参数以进行就地编辑。

sed -i '/^[[:blank:]]*$/d' file

【讨论】:

    【解决方案2】:

    问题是grep-Z 标志。它会导致grep 以空字符而不是换行符来终止匹配的行。这不适用于sed,因为sed 逐行处理输入,并且它希望每一行都以换行符终止。在您的示例中,grep 不发出任何换行符,因此就sed 而言,它接收到一个没有终止换行符的文本块,因此它将其作为单行处理,因此模式@987654328 @ 不匹配任何内容。

    此外,-z 标志只有在find 的输出中的文件名以空字符终止时才有意义,即带有-print0 标志。但是您没有使用它,因此grep 中的-z 标志毫无意义。 -Z 标志也毫无意义,因为当管道中的下一个命令需要空终止记录时应该使用它,这不是你的情况。

    这样做:

    find ~/AppData/Local/atom/ -name atom.sh -type f -print0 | grep -zF 'cli/atom.sh' | tr '\0' '\n' | tail -n 1
    

    【讨论】:

      【解决方案3】:

      并非所有sed 都支持标记\s 用于任何空白字符。

      您可以使用字符类[[:blank:]](用于空格或制表符)或[[:space:]](用于任何空格):

      sed '/^[[:blank:]]*$/d'
      sed '/^[[:space:]]*$/d'
      

      【讨论】:

      • [[:blank:]] 用于空格和制表符,所以我认为您不需要第二个 sed 命令。
      • @Kenavoz 是的,这只是为了完整性(并符合\s)。
      猜你喜欢
      • 2013-05-01
      • 2015-05-20
      • 2018-08-28
      • 2018-01-14
      • 2019-09-12
      • 2021-10-15
      • 2012-09-04
      • 1970-01-01
      • 2013-11-20
      相关资源
      最近更新 更多