SED命令删除空行直到第一次出现句子

时间:2013-11-04 12:17:18

标签: regex macos bash sed

我的输入文件将是

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

此处[emptyline]表示空白行。

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

aaa
bbb
[emptyline]
cc
dd

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

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

其他信息其MAC OSx

6 个答案:

答案 0 :(得分:3)

你可以在sed:

中进行分支
sed '/^ *$/d; :a; n; ba' file

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

如果您可以减少对sed的需求,效率更高,请参阅gniourf_gniourf's answer了解替代方案。

这可以用awk表达:

awk 'NF {f=1} f' file

两种情况下的输出:

aaa
bbb

cc
dd

解释

两种选择都是通过寻找第一个非空行来实现的。

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

当行为空awk为零时,

NF会为每一行更新NF。这被用于设置print-flag(f)。

答案 1 :(得分:3)

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

以下是使用纯BASH方式删除文件启动时所有空白行的另一种方法,不涉及任何外部实用程序,如awk / sed:

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

cc
dd

答案 5 :(得分:0)

sed -n "H;$ {x;s/^\n*//p;}"

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