dog*_*ane 51
来自sed的有用单行脚本:
# Delete all leading blank lines at top of file (only).
sed '/./,$!d' file
# Delete all trailing blank lines at end of file (only).
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file
Run Code Online (Sandbox Code Playgroud)
因此,要从文件中删除前导和尾随空行,可以将上述命令组合到:
sed -e :a -e '/./,$!d;/^\n*$/{$d;N;};/\n$/ba' file
Run Code Online (Sandbox Code Playgroud)
Izk*_*ata 10
因此,我将借用@ dogbane的部分答案,因为sed
删除前导空白行的那一行很短...
tac
是coreutils的一部分,并反转文件.所以做两次:
tac file | sed -e '/./,$!d' | tac | sed -e '/./,$!d'
Run Code Online (Sandbox Code Playgroud)
它当然不是最有效的,但除非你需要效率,否则我发现它比其他任何东西都更具可读性.
正如另一个答案中提到的,tac
是 coreutils 的一部分,并反转文件。将执行两次的想法与命令替换将删除尾随新行的事实相结合,我们得到
echo "$(echo "$(tac "$filename")" | tac)"
Run Code Online (Sandbox Code Playgroud)
这不取决于sed
. 您可以使用它echo -n
来去除剩余的尾随换行符。
这是 awk 中的一次性解决方案:它在看到非空行之前不会开始打印,当看到空行时,它会记住它直到下一个非空行
awk '
/[[:graph:]]/ {
# a non-empty line
# set the flag to begin printing lines
p=1
# print the accumulated "interior" empty lines
for (i=1; i<=n; i++) print ""
n=0
# then print this line
print
}
p && /^[[:space:]]*$/ {
# a potentially "interior" empty line. remember it.
n++
}
' filename
Run Code Online (Sandbox Code Playgroud)
请注意,由于我用来考虑空行/非空行(带有[[:graph:]]
和/^[[:space:]]*$/
)的机制,只有空格的内部行将被截断为真正的空行。
这是一个经过修改的 sed 版本,它也将那些只有空格和制表符的行视为“空”。
\n\nsed -e :a -e \'/[^[:blank:]]/,$!d; /^[[:space:]]*$/{ $d; N; ba\' -e \'}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n它基本上是接受的答案版本(考虑 BryanH 评论),但.
第一个命令中的点已更改为[^[:blank:]]
(任何非空白的内容),\\n
第二个命令地址内部已更改为[[:space:]]
允许换行符、空格和制表符。
替代版本,不使用 POSIX 类,但您的 sed 必须支持\\t
在. GNU sed 可以,BSD sed 不能。\\n
[\xe2\x80\xa6]
sed -e :a -e \'/[^\\t ]/,$!d; /^[\\n\\t ]*$/{ $d; N; ba\' -e \'}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n测试:
\n\nprompt$ printf \'\\n \\t \\n\\nfoo\\n\\nfoo\\n\\n \\t \\n\\n\' \n\n\n\nfoo\n\nfoo\n\n\n\nprompt$ printf \'\\n \\t \\n\\nfoo\\n\\nfoo\\n\\n \\t \\n\\n\' | sed -n l\n$\n \\t $\n$\nfoo$\n$\nfoo$\n$\n \\t $\n$\nprompt$ printf \'\\n \\t \\n\\nfoo\\n\\nfoo\\n\\n \\t \\n\\n\' | sed -e :a -e \'/[^[:blank:]]/,$!d; /^[[:space:]]*$/{ $d; N; ba\' -e \'}\'\nfoo\n\nfoo\nprompt$\n
Run Code Online (Sandbox Code Playgroud)\n
-z
这可以通过 sed选项轻松解决
sed -rz 's/^\n+//; s/\n+$/\n/g' file
Hello
Welcome to
Unix and Linux
Run Code Online (Sandbox Code Playgroud)