5

我的输入文件将是

[emptyline]
[emptyline]
aaa
bbb
[emptyline]
cc
dd

这里 [emptyline] 表示空白行。

我需要一个 SED 命令将其更改为

aaa
bbb
[emptyline]
cc
dd

也就是说,我需要单独删除顶部的所有空行。

我只需要 SED 命令,因为我需要在 bash 脚本中使用它。

MAC OSx 的附加信息

4

6 回答 6

4

您可以通过 sed 中的分支来实现:

sed '/^ *$/d; :a; n; ba' file

更有效的解决方案是使用范围表达式,有关如何执行此操作,请参阅user2719058 的答案。

如果您可以减少对 sed 的需求,则效率更高,请参阅gniourf_gniourf 的替代方案答案

这可以像这样优雅地用 awk 表示:

awk 'NF {f=1} f' file

两种情况下的输出:

aaa
bbb

cc
dd

解释

两种选择都通过寻找第一个非空行来工作。

使用sed该模式/^ *$/d将删除文件开头的所有空行。接下来是一个打印文件其余部分的循环。

awkNF将为每一行更新,当该行为空时NF为零。这被用于设置打印标志 ( f)。

于 2013-11-04T12:25:58.107 回答
3

如果这些行真的是空的(没有空格),我会建议

sed -n '/./,$p',否则sed -n $'/[^ \t]/,$p'。($'..'语法使 bash 扩展\t,因此您不需要理解它的 sed。)

于 2013-11-04T18:34:38.753 回答
2

一种有趣的可能性:

{ sed -n '/./{p;q}' && cat; } < file

而且还真的很有效!(尝试将其与其他方法进行基准测试)。如果您的第一行中可能有一些空格,您可以这样做:

{ sed -n '/[^[:space:]]/{p;q}' && cat; } < file

sed在读取一个字符之前什么都不做;此时它打印出该行并退出。然后cat输出整个东西;因此,由于不再sed进行过滤,因此数据流过的速度要快得多cat

与以下相同grep

{ grep -v -m 1 '^$' && cat; } < file

或丢弃可能有空格的前导行:

{ grep -v -m 1 '^[[:space:]]*$' && cat; } < file
于 2013-11-04T19:05:31.570 回答
0

一个简单的方法是:sed '1,/^$/d' file

它将从第 1 行开始删除到文件实际内容之前的最后一个空白行;根据 OP 的需要保留其他空白行。

于 2013-11-04T13:04:14.493 回答
0

这是另一种使用纯 BASH 方式在文件开始时删除所有空行的方法,而不涉及任何外部实用程序,如 awk/sed:

[[ "$(<file)" =~ ^[[:space:]]+(.*)$ ]] && echo "${BASH_REMATCH[1]}"
aaa
bbb

cc
dd
于 2013-11-04T15:55:44.857 回答
0
sed -n "H;$ {x;s/^\n*//p;}"

删除所有第一个 \n ant 考虑到第一行可能不是空的(1,/^$/在这种情况下不起作用)

于 2013-11-04T20:41:59.650 回答