我的输入文件将是
[emptyline]
[emptyline]
aaa
bbb
[emptyline]
cc
dd
此处[emptyline]表示空白行。
我需要一个SED命令将其更改为
aaa
bbb
[emptyline]
cc
dd
也就是说,我需要单独删除顶部的所有空白行。
我只需要SED命令,因为我需要在bash脚本中使用它。
其他信息其MAC OSx
答案 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,/^$/
在这种情况下不起作用)