如何用SED删除多个空行?

时间:2012-09-11 15:30:05

标签: sed text-processing

我正在尝试通过使用sed删除重复的空行来压缩文本文档。这就是我正在做的事情(无济于事):

sed -i -E 's/\n{3,}/\n/g' file.txt

根据this manual,我明白这是不正确的,但我无法弄清楚如何正确地做到这一点。感谢。

5 个答案:

答案 0 :(得分:4)

我认为您希望用一个空白行替换多个空白行的跨度,即使您的示例使用单个\n而不是\n替换了多个\n\n行。考虑到这一点,这里有两个解决方案:

sed '/^$/{ :l
    N; s/^\n$//; t l
    p; d; }' input 

在sed的许多实现中,可以全部在一行上,嵌入的换行符由;替换。

awk 't || !/^$/; { t = !/^$/ }'

答案 1 :(得分:3)

正如上面提到的三元组,我使用的是Perl而不是sed

perl -0777pi -e 's/\n{3,}/\n\n/g'

答案 2 :(得分:2)

使用翻译功能

 tr -s '\n'

-s或--squeeze-repeats将重复字符序列减少为单个实例。

答案 3 :(得分:1)

tr -s '\n'cat -s处理得更好,但如果您坚持使用sed,请参阅GNU sed手册第4.17节中的示例:

#!/usr/bin/sed -f

# on empty lines, join with next
# Note there is a star in the regexp
:x
/^\n*$/ {
  N
  bx
}
# now, squeeze all '\n', this can be also done by:
# s/^\(\n\)*/\1/
s/\n*/\
/

答案 4 :(得分:0)

我不确定这是OP想要的,但是如果您要删除文件中的所有空行,可以使用William Pursell的awk解决方案:

awk '!/^$/' file.txt

说明:

awk模式

'!/^$/'

正在测试当前行是否仅由行的开头(由'^'表示)和行的结束(由'$'表示)组成,换句话说,该行是否为空。 / p>

如果此模式为true,awk将应用其默认值并打印当前行。

HTH