5

我编写了一个 sed 脚本,它用一个空行替换了多个空行,但它没有按预期工作。我会感谢大家,谁能解释我为什么。请不要让我参考工作示例,我对 Google 很熟悉。我只是想了解 sed 是如何工作的。

代码是

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

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

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

有任何想法吗?

4

2 回答 2

7

阅读下一行时出现问题sedEOF

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

我的解决方案是:

sed ':a; /^\n*$/{ s/\n//; N;  ba};' yourfile
于 2014-07-16T13:38:50.623 回答
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 ''
于 2014-07-16T12:53:45.740 回答