使用 sed 从管道中删除空行

Posted

技术标签:

【中文标题】使用 sed 从管道中删除空行【英文标题】:removing empty lines from a pipe using 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的组合暂时解决了问题...... 【参考方案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)。

以上是关于使用 sed 从管道中删除空行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sed 命令正则表达式在文件中查找第一个空行并删除

在 Bash 中删除空行并修剪周围的空间

无法使用 sed 正则表达式删除空行

sed删除所有空行

如何删除垂直条或管道 |内双竖条/管道|使用 sed?

linux下删除空行的几种方法