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



使用 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调用中从文件的开头和结尾进行修剪,那没关系,尽管我也对在一次调用中管理所有内容的解决方案感兴趣。

附言这在Perl/Ruby等中很容易,但我特别想知道这在sed中是否可行。 谢谢!

我还没有看到任何真正的 sed 专家弹出解决方案,所以这是我的尝试(由于 Ss,GNU sed 特定于 - 将 POSIX 分别替换为 [^[:space:]][[:space:]]):

$ sed -e '/S/,$!d' -e :a -e '/^s*$/{$d;N;ba' -e '}' file
foo
bar
baz

qux

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

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

qux

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

awk -v RS='^C' '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")}1' file

否则:

awk '{rec=rec $0 RS} END{gsub(/^[[:space:]]+|[[:space:]]+$/,"",rec); print rec}' file

或者,如果您的内存有限并且无法一次读取整个文件,则需要 2 次传递才能确定最后一个非空行的位置,例如:

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

或者,您需要缓冲空白行(在初始行集之后),直到点击非空行,然后在当前行之前打印该缓冲区:

awk 'NF{printf "%s%sn",buf,$0; buf=""; f=1; next} f{buf = buf $0 RS}' file

最新更新