sed 删除特定行号后的空行

sed 删除特定行号后的空行

我试图删除第 3 行之后的所有空行,直到文件末尾:

cat ${File}
1

2
3


4

5

5



6
7



8
9


sed -e '3,${s~^$~~g}' ${File}
1

2
3


4

5

5



6
7



8
9

观察:输出没有变化。

所需输出

1

2
3
4
5
5
6
7
8
9

有什么建议么?

答案1

尝试:

sed '4,$ {/^$/d}' infile

从第4行开始直到文件末尾,删除空行。

您的命令的问题是您再次用空字符串替换空行s~^$~~g(与 相同s~^$~~)并且您没有删除它。

注意:由于您使用默认斜杠以外的不同分隔符/,要使用此样式,~^$~d您需要转义第一个~以表明sed它不是正则表达式的一部分:

sed -e '4,${ \~^$~d }' infile

man sed在“地址”下:

\C正则表达式C 匹配与正则表达式 regexp 匹配的行。这C可以是任何字符。


如果您想删除空行以及仅包含空格(制表符/空格)的行,您可以执行以下操作:

sed '4,${ /^[[:blank:]]*$/d }' infile

答案2

另一个awk解决方案:

awk 'NR<=3||NF' file

这将打印行号小于或等于 3 或至少有一个“字段”(默认情况下定义为至少一个非空白字符)的所有行。这样,您还可以排除不包含“文本”但仅“视觉上”为空的行,即仍包含空格或制表符的行。

答案3

sed '1,3b;/./!d'

在范围 1,3 中分支或如果为空则删除。

答案4

解决方案awk

awk '((NR > 3 && $0!~/^$/) || NR <= 3) { print }' file

相关内容