使用 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
$ 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