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