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

use*_*841 5 regex string perl

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

perl -pi -w -e "s/\n\n//g" *.html
Run Code Online (Sandbox Code Playgroud)

但没有运气.好的方面,我试过了

perl -pi -w -e "s/\n//g" *.html
Run Code Online (Sandbox Code Playgroud)

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

编辑我也试过\r\n\r\n,同样的交易.作为单个换行符工作,对连续两个换行没有任何作用.

cjm*_*cjm 19

用途-0:

perl -pi -0 -w -e "s/\n\n//g" *.html
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ian*_*Ian 5

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

perl -pi -w -e 's/^\n$//' file.txt
Run Code Online (Sandbox Code Playgroud)