使用 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 从管道中删除空行的主要内容,如果未能解决你的问题,请参考以下文章