使用sed

时间:2016-11-14 05:55:49

标签: linux bash unix git-bash

$ 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

3 个答案:

答案 0 :(得分:5)

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

sed '/^$/d' file

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

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

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

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

答案 1 :(得分:0)

并非所有sed都支持任何空格字符的令牌\s

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

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

答案 2 :(得分:0)

问题是-Z的{​​{1}}标志。它会导致grep以空字符而不是换行符终止匹配的行。这不会与grep一起使用,因为sed逐行处理输入,并且它希望每一行都以换行符结束。在您的示例中,sed不会发出任何换行符,因此就grep而言,它会收到一个没有终止换行符的文本块,因此会将其作为单行处理,所以模式sed并不匹配任何东西。

此外,/^\s*$/标志仅在-z的输出中的文件名由空字符(即find标志)终止时才有意义。但是您没有使用它,因此-print0中的-z标记毫无意义。并且grep标志也没有意义,因为当管道中的下一个命令期望以空值终止的记录时应该使用它,这不是你的情况。

这样做:

-Z
相关问题