【问题标题】:find and replace double newlines with perl?用perl查找并替换双换行符?
【发布时间】:2010-08-21 01:01:26
【问题描述】:

我正在清理一些网页,这些网页由于某种原因在标签之间有大约 8 个换行符。我想删除它们中的大部分,我尝试了这个

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

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

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

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

编辑我也试过\r\n\r\n,同样的交易。作为一个换行符工作,对于两个连续的不做任何事情。

【问题讨论】:

    标签: regex perl string


    【解决方案1】:

    使用-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) 上拆分文件。

    【讨论】:

    • 我试图在大文件 (2.3G) 上使用上述建议将双换行符替换为单个换行符,但遇到了段错误。请参阅下面的解决方案。
    • @Ian,我为大文件添加了另一种解决方法,即使您无法重写正则表达式以仅应用于一行,它仍然可以工作。
    【解决方案2】:

    我试图在大文件 (2.3G) 上使用上述建议将双换行符替换为单换行符 对于大文件,尝试一次读取整个文件时会出现段错误。因此,与其寻找双换行符,不如寻找唯一的字符是换行符的行:

    perl -pi -w -e 's/^\n$//' file.txt
    

    【讨论】:

    • 请注意,上面-pi中的“i”表示就地编辑-小心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多