【问题标题】:how to trim consecutive whitespace from beginning/end of file via sed如何通过sed从文件的开头/结尾修剪连续的空白
【发布时间】:2023-03-21 15:44:01
【问题描述】:

使用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 中是否可行。谢谢!

【问题讨论】:

  • 您想完全删除任何运行的纯空白行,但只保留单个纯空白行?
  • 不,文件开头/结尾的单行空白行也应该被修剪。
  • 这并不能完全回答问题。是否应该删除文件中间的单个 ws-only 行?文件中间连续的 ws-only 行应该折叠成一行还是删除?开头和结尾的所有 ws-only 行都应该删除,这看起来很清楚。
  • 我可以把lisp 的链接发给你在sed 中实现的吗?
  • 给你 :-) github.com/shinh/sedlisp !享受,享受! ;-)

标签: sed whitespace removing-whitespace


【解决方案1】:

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

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

baz


qux

如果有人想看到一种明智的方法来与最终调用的任何神秘的 sed 咒语进行比较,这里有一种方法是使用 GNU awk 表示多字符 RS\s 的缩写 [[: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%s\n",buf,$0; buf=""; f=1; next} f{buf = buf $0 RS}' file

【讨论】:

  • 很好,但是您将如何使用普通的 POSIX awk 来做到这一点?
  • 我添加了几个 POSIX 等效项。
  • 太好了,谢谢!它也应该是可能的,而不必一次将超过一个段落啜饮到内存中,但我还没有费心去实现它。
  • 是的,但是您需要 2 遍或空白行缓冲区,当您遇到非空行时会打印出来。我添加了同时具备这两种功能的版本。
  • @AdamSpiers 嗯,我以为我们现在会被一大堆字母和标点符号与符文和蝙蝠侠符号混合在一起。想知道所有 sed-ies 都在哪里......我更新了我的答案,现在包括一个 sed 解决方案,我希望其他人会提供更好的解决方案。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多