我编写了一个sed脚本,用一个替换多个空白行,但它没有按预期工作。我将感谢所有能解释我原因的人。请不要参考我的工作示例,我熟悉Google。我只是想了解sed是如何工作的。
代码是
sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file
所以逻辑很简单:当sed读取行并且它是空白或有几个换行符号(这是/^*\n$
条件)时,我告诉sed将下一行附加到模式空间。只要找到非空白行,就会完成替换s/^\n\n*/\n/
。
除了文件末尾有空行的情况外,一切正常。这些空白不会被一个空白所取代,我不明白为什么。
有什么想法吗?
答案 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 ''