繁体   English   中英

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

[英]SED command to delete empty lines till the first occurrence of sentence

我的输入文件将是

[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为零。 这被用于设置print-flag( 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是: 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,/^$/在这种情况下不起作用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM