使用Perl正则表达式如何将多个换行符替换为单个换行符?

6

我有一个包含空行(\n\n)的文档。可以使用sed命令来删除它们:

echo $'a\n\nb'|sed -e '/^$/d'

但是我该如何在Perl中使用普通的正则表达式来实现呢?像下面这样的任何东西都没有显示任何结果。

echo $'a\n\nb'|perl -p -e 's/\n\n/\n/s'

5
如果您需要将其作为Shell脚本的过滤器,就像您的示例所假设的那样,那么使用cat -s会更快且更兼容。 - Marian
@Marian 感谢您指出这一点。我刚刚意识到今天我从未阅读过 man cat - Sinan Ünür
@Marian 我以后不需要它作为输入了;但是还是谢谢你指出来。我将来可能会用到它 :) - Simon A. Eugster
3个回答

13

您需要使用s/^\n\z//。输入是逐行读取的,因此您永远不会得到多个换行符。相反,消除不包含其他字符的行。您应该使用以下方式调用perl

perl -ne 's/^\n\z//; print'

不需要使用/s开关。


1
这比一次性读取整个文件要好得多,如果文件非常大,则不是一个好主意。 - Ether
一个稍微不同的方法是 perl -pne 's/^\n\z//'。使用 -p 选项时不需要 print - steveb

6

不打印空行的问题更为简单:

$(input) | perl -ne 'print if /\S/' 

将输出除了只包含空格的行之外的所有行。


3
输入分为三行,使用带有-p选项的perl每次只处理一行。解决方法是告诉perl一次读取多行输入。其中一种方法是:
echo $'a\n\nb' | perl -pe 'BEGIN{$/=undef}; s/\n\n/\n/'

这里 $/ 记录分隔符变量,它告诉perl如何将输入流解析为行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接