我正在尝试通过使用sed
删除重复的空行来压缩文本文档。这就是我正在做的事情(无济于事):
sed -i -E 's/\n{3,}/\n/g' file.txt
根据this manual,我明白这是不正确的,但我无法弄清楚如何正确地做到这一点。感谢。
答案 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