我的输入文件将是
[emptyline]
[emptyline]
aaa
bbb
[emptyline]
cc
dd
这里 [emptyline] 表示空白行。
我需要一个 SED 命令将其更改为
aaa
bbb
[emptyline]
cc
dd
也就是说,我需要单独删除顶部的所有空行。
我只需要 SED 命令,因为我需要在 bash 脚本中使用它。
MAC OSx 的附加信息
您可以通过 sed 中的分支来实现:
sed '/^ *$/d; :a; n; ba' file
更有效的解决方案是使用范围表达式,有关如何执行此操作,请参阅user2719058 的答案。
如果您可以减少对 sed 的需求,则效率更高,请参阅gniourf_gniourf 的替代方案答案。
这可以像这样优雅地用 awk 表示:
awk 'NF {f=1} f' file
两种情况下的输出:
aaa
bbb
cc
dd
两种选择都通过寻找第一个非空行来工作。
使用sed
该模式/^ *$/d
将删除文件开头的所有空行。接下来是一个打印文件其余部分的循环。
awk
NF
将为每一行更新,当该行为空时NF
为零。这被用于设置打印标志 ( f
)。
如果这些行真的是空的(没有空格),我会建议
sed -n '/./,$p'
,否则sed -n $'/[^ \t]/,$p'
。($'..'
语法使 bash 扩展\t
,因此您不需要理解它的 sed。)
一种有趣的可能性:
{ 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
一个简单的方法是:sed '1,/^$/d' file
它将从第 1 行开始删除到文件实际内容之前的最后一个空白行;根据 OP 的需要保留其他空白行。
这是另一种使用纯 BASH 方式在文件开始时删除所有空行的方法,而不涉及任何外部实用程序,如 awk/sed:
[[ "$(<file)" =~ ^[[:space:]]+(.*)$ ]] && echo "${BASH_REMATCH[1]}"
aaa
bbb
cc
dd
sed -n "H;$ {x;s/^\n*//p;}"
删除所有第一个 \n ant 考虑到第一行可能不是空的(1,/^$/
在这种情况下不起作用)