sed用单个空行替换多个空行

时间:2014-07-16 12:43:47

标签: regex sed blank-line

我编写了一个sed脚本,用一个替换多个空白行,但它没有按预期工作。我将感谢所有能解释我原因的人。请不要参考我的工作示例,我熟悉Google。我只是想了解sed是如何工作的。

代码是

sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file

所以逻辑很简单:当sed读取行并且它是空白或有几个换行符号(这是/^*\n$条件)时,我告诉sed将下一行附加到模式空间。只要找到非空白行,就会完成替换s/^\n\n*/\n/

除了文件末尾有空行的情况外,一切正常。这些空白不会被一个空白所取代,我不明白为什么。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

问题是sed在阅读下一行时获得EOF

在使用N阅读下一行时,您的命令已完成。因为,在阅读下一行时,sed获取EOF。因此,它不会处理s/^\n\n*/\n/替换。这就是为什么,你无法删除出现在文件末尾的空行序列。

我的解决方案是:

sed ':a; /^\n*$/{ s/\n//; N;  ba};' yourfile

答案 1 :(得分:1)

而不是\n\n*,您可以使用\n+

顺便说一下,这就像Perl单行一样:

perl -0777 -pe 's/\n+/\n/g' yourfile

或者,对于相同的结果但更少的替换:

perl -0777 -pe 's/\n\n+/\n/g' yourfile

或者,更神奇的是,尝试@hwnd建议的这个紧凑的解决方案:

perl -00 -pe ''