
[英]Using sed, for every occurrence of a string, except the first, delete two lines
[英]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.