使用sed
,如何从文件的开头和/或结尾修剪一个或多个连续仅空白行? (“仅限空格”,我指的是不包含任何非空格字符的行,即空白或仅包含空白字符的行。)
例如,如果我的文件是:
<blank line>
<line only containing some space/tab characters>
<blank line>
foo
bar
<tab character>
baz
<space character>
<space character><tab character>
qux
<tab character>
然后所需的输出将是:
foo
bar
<tab character>
baz
<space character>
<space character><tab character>
qux
如果文件开头和结尾的修剪必须在单独的sed
调用中完成,那没关系,尽管我也对在一次调用中管理它的解决方案感兴趣。
P.S。这在Perl / Ruby等中很容易,但我特别想知道它是否可以在sed
中使用。谢谢!
答案 0 :(得分:2)
我没有看到任何真正的sed专家提出解决方案,所以这是我的尝试(因\S
和\s
而特定的GNU sed - 替换为[^[:space:]]
和{{ 1}}分别用于POSIX):
[[:space:]]
如果有人希望看到一种明智的方法来比较最终调用的任何神秘的sed咒语,这里使用GNU awk的一种方式,用于$ sed -e '/\S/,$!d' -e :a -e '/^\s*$/{$d;N;ba' -e '}' file
foo
bar
baz
qux
和RS
缩写{{1 }}:
\s
POSIX等效如果您很乐意选择一些您知道不能在输入中的控件字符(例如使用[[:space:]]
=文字$ awk -v RS='^$' '{gsub(/^\s+|\s+$/,"")}1' file
foo
bar
baz
qux
字符):
^C
否则:
control-C
或者如果你的内存有限并且无法立即读取整个文件,则需要2次传递以确定最后一个非空行的位置,例如:
awk -v RS='^C' '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")}1' file
或者您需要缓冲空白行(在初始设置之后),直到您点击非空白行,然后在当前行之前打印该缓冲区:
awk '{rec=rec $0 RS} END{gsub(/^[[:space:]]+|[[:space:]]+$/,"",rec); print rec}' file