sed 删除特定行号后的空行

Por*_*ine -1 sed gnu text-processing

我试图删除第 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

Run Code Online (Sandbox Code Playgroud)

观察:输出没有变化。

期望输出

1

2
3
4
5
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

有什么建议?

αғs*_*нιη 8

尝试:

sed '4,$ {/^$/d}' infile
Run Code Online (Sandbox Code Playgroud)

从4开始线,直到该文件结束时,删除该空行。

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

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

sed -e '4,${ \~^$~d }' infile
Run Code Online (Sandbox Code Playgroud)

请参阅man sed“地址”下的内容:

\c regexp c 匹配与正则表达式regexp匹配的行。所述Ç可以是任何字符。


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

sed '4,${ /^[[:blank:]]*$/d }' infile
Run Code Online (Sandbox Code Playgroud)


Adm*_*Bee 7

另一种awk解决方案:

awk 'NR<=3||NF' file
Run Code Online (Sandbox Code Playgroud)

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