使用 sed 从管道中删除空行

removing empty lines from a pipe using sed

$ 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

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

sed '/^$/d' file

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

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

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

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

并非所有 sed 都支持任何白色 space 字符的标记 \s

您可以使用字符 class [[:blank:]](对于 space 或制表符),或 [[:space:]](对于任何白色 space):

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

问题是 grep-Z 标志。它导致 grep 以空字符而不是换行符终止匹配的行。这不适用于 sed,因为 sed 逐行处理输入,并且它期望每行以换行符终止。在您的示例中 grep 不会发出任何换行符,因此就 sed 而言,它会收到一段没有终止换行符的文本,因此它将其作为单行处理,依此类推模式 /^\s*$/ 不匹配任何内容。

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

这样做:

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