我正在清理一些网页,这些网页由于某种原因在标签之间有大约8个换行符。我想删除其中的大多数,我试过这个
perl -pi -w -e "s/\n\n//g" *.html
但没有运气。为了更好的衡量,我尝试了
perl -pi -w -e "s/\n//g" *.html
它确实删除了我的所有换行符。我做错了什么?
修改我也试过\r\n\r\n
,同样的交易。作为一个单独的换行符,对两个连续换行没有任何作用。
答案 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