用perl查找并替换双重换行符?

时间:2010-08-21 01:01:26

标签: regex perl string

我正在清理一些网页,这些网页由于某种原因在标签之间有大约8个换行符。我想删除其中的大多数,我试过这个

perl -pi -w -e "s/\n\n//g" *.html

但没有运气。为了更好的衡量,我尝试了

perl -pi -w -e "s/\n//g" *.html

它确实删除了我的所有换行符。我做错了什么?

修改我也试过\r\n\r\n,同样的交易。作为一个单独的换行符,对两个连续换行没有任何作用。

2 个答案:

答案 0 :(得分:19)

使用-0

perl -pi -0 -w -e "s/\n\n//g" *.html

问题是默认情况下-p一次读取一行文件。没有带有两个换行符的行,所以你找不到任何换行符。 -0将行尾字符更改为"\0",这可能在您的文件中不存在,因此它会立即处理整个文件。 (即使文件确实包含NUL,您也在寻找连续的换行符,因此以NUL分隔的块处理它不会有问题。)

您可能也想调整正则表达式,但很难确切地确定您想要的是什么。试试s/\n\n+/\n/g,它会用一个换行符替换任意数量的连续换行符。

如果文件非常大,则可能没有足够的内存将其加载到一个块中。解决此问题的方法是选择一些常用的字符,将文件拆分为可管理的块,并告诉Perl将其用作行结束字符。但它也必须是一个不会出现在你想要替换的比赛中的角色。例如,-0x2e会将文件拆分为"."(ASCII 0x2E)。

答案 1 :(得分:5)

我试图在一个大文件上使用上面的建议替换一个双换行(2.3G)对于大文件,它会在尝试一次读取整个文件时出错。因此,不要寻找双重换行符,只需查找唯一的char是换行符的行:

perl -pi -w -e 's/^\n$//' file.txt
相关问题