如何通过sed从文件开头/结尾修剪连续的空白

如何通过sed从文件开头/结尾修剪连续的空白,sed,whitespace,removing-whitespace,Sed,Whitespace,Removing Whitespace,使用sed,如何从文件的开头和/或结尾修剪一行或多行连续的纯空白行?(所谓“仅限空白”,是指不包含任何非空白字符的行,即空白行或仅包含空白字符的行。) 例如,如果我的文件是: <blank line> <line only containing some space/tab characters> <blank line> foo bar <tab character> baz <space character> <space c

使用
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
foo
酒吧
巴兹
库克斯
如果必须在单独的
sed
调用中从文件的开头和结尾进行修剪,那没关系,尽管我也对在一次调用中管理所有内容的解决方案感兴趣


另外,这在Perl/Ruby等语言中很容易实现,但我特别想知道在
sed
中是否可以实现。谢谢

我还没有看到任何真正的sed专家拿出解决方案,所以我尝试一下(GNU sed特定于
\s
\s
-替换为
[^[:space:]
[:space:]
,分别用于POSIX):

如果有人想看到一种明智的方法来比较最终调用的任何神秘的sed咒语,这里有一种方法使用GNU awk来表示多字符
RS
\s
的缩写
[[:space:]

$ awk -v RS='^$' '{gsub(/^\s+|\s+$/,"")}1' file
foo
bar

baz


qux
如果您乐于选择一些您知道不能在输入中的控件字符(例如,使用
^C
=文本
控件-C
字符),则POSIX等效:

否则:

awk '{rec=rec $0 RS} END{gsub(/^[[:space:]]+|[[:space:]]+$/,"",rec); print rec}' file
或者,如果您的内存有限,无法一次读取整个文件,则需要通过两次才能确定最后一个非空行的位置,例如:

awk 'NR==FNR{if(NF){if(!beg)beg=NR; end=NR}; next} (FNR>=beg)&&(FNR<=end)' file file

您想完全删除所有只包含空格的行,但只保留单个空格行吗?不,文件开头/结尾的单个空格行也应该被修剪。这并不能完全回答问题。应该删除文件中间的单WS行吗?文件中间的连续WS唯一行是否被折叠成一行或删除?开始和结束处的所有ws-only行都应该删除,这似乎很清楚。我是否应该向您发送在
sed
中实现的
lisp
的链接?给您:-)!享受,享受!;-)很好,但是你会如何使用香草POSIX awk呢?我添加了两个POSIX等价物。非常好,谢谢!这也应该是可能的,而不必一次将多个段落读入内存,但我还没有费心去实现它。是的,但你需要两个过程或一个空行缓冲区,当你碰到一个非空行时,它会被打印出来。我添加了两个版本。@AdamSpiers嗯,我想我们现在已经被淹没在一堆字母和标点符号中,混杂着符文和蝙蝠侠符号。想知道所有的塞德人都在哪里。。。。我更新了我的答案,现在包括一个sed解决方案,我希望其他人会提供更好的解决方案。
awk '{rec=rec $0 RS} END{gsub(/^[[:space:]]+|[[:space:]]+$/,"",rec); print rec}' file
awk 'NR==FNR{if(NF){if(!beg)beg=NR; end=NR}; next} (FNR>=beg)&&(FNR<=end)' file file
awk 'NF{printf "%s%s\n",buf,$0; buf=""; f=1; next} f{buf = buf $0 RS}' file