Regex SED命令删除空行,直到第一个句子出现

Regex SED命令删除空行,直到第一个句子出现,regex,macos,bash,sed,Regex,Macos,Bash,Sed,我的输入文件将被删除 [emptyline] [emptyline] aaa bbb [emptyline] cc dd 此处[emptyline]表示空白线 我需要一个SED命令来将其转换为 aaa bbb [emptyline] cc dd 这是,我需要删除顶部的所有空白行。< /P> 我只需要SED命令,因为我需要在bash脚本中使用它 关于MAC OSx的其他信息您可以通过sed中的分支来实现: sed '/^ *$/d; :a; n; ba' file 一个更有效的解决方案是使用

我的输入文件将被删除

[emptyline]
[emptyline]
aaa
bbb
[emptyline]
cc
dd
此处[emptyline]表示空白线

我需要一个SED命令来将其转换为

aaa
bbb
[emptyline]
cc
dd

这是,我需要删除顶部的所有空白行。< /P> 我只需要SED命令,因为我需要在bash脚本中使用它


关于MAC OSx的其他信息

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

sed '/^ *$/d; :a; n; ba' file
一个更有效的解决方案是使用范围表达式,有关如何执行此操作,请参阅

如果您可以减少对sed的需求,那么它将更加高效,请参阅以获取替代方案

这可以用awk优雅地表达如下:

awk 'NF {f=1} f' file
两种情况下的输出:

aaa
bbb

cc
dd
解释 这两种方法都是通过查找第一个非空行来实现的

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


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

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


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

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

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

cc
dd

[[”$(如果行是空的(没有空格),我建议

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

一个有趣的可能性:

{ sed -n '/./{p;q}' && cat; } < file
或丢弃可能带有空格的前导行:

{ grep -v -m 1 '^[[:space:]]*$' && cat; } < file
{grep-v-m1'^[:space:][]*$'&&cat;}


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

所需的其他信息:到目前为止您尝试了什么?我找不到解决方案。我正在使用sed删除文件中的所有第一行,当时我的第一行后的一个空行造成了此问题…我得到了如下结果。sed:1:“/^$/!{:a;p;n;ba;}”:意外的EOF(待定的)@damienfrancois:为awk命令的awk答案+1添加了一些解释,另一个答案中的sed命令不起作用。@unxnut的命令对我不起作用。你能再给我一次吗?@damienfrancois:我太匆忙了,没有很好地测试unxnut的答案。我已经回滚了我的答案。如果有3个空格,这将在开始时留下1个空格行如果有更多的空行,则会有更多的空行。简言之,只有当正好有2行空行时,此命令才会起作用。@Thor:这些行中没有空格。请尝试在输入文件中的
aaa
之前插入5-6行空行。请注意,这将删除第一行,即使它不是空行。我知道OP没有提到p第一行不是空行的可能性,但我认为它无论如何都值得一提。@anubhava:你是对的,它不起作用。我测试得不够好。对@anubhava我的错误。最好写
[:space:]*
以防没有前导空行。否则方法很酷,但不适合大文件。
:)
@gniourf\u gniourf:我故意将其保留为
[:space:]+
如果没有前导空行且没有任何内容可删除,则避免此操作。当文件中没有前导空格时,您的方法会中断,并且会从第一个非空行的开头删除空格。很有创意,我喜欢:)非常感谢..这正是我需要的
{ grep -v -m 1 '^$' && cat; } < file
{ grep -v -m 1 '^[[:space:]]*$' && cat; } < file
sed -n "H;$ {x;s/^\n*//p;}"