macOS下使用Perl命令批量替换含段落换行内容的问题求助
解决macOS下Perl跨行替换失效的问题
你的问题核心在于Perl默认的逐行处理模式:-p选项会让Perl每次只读取一行文本,并且自动去掉每行末尾的换行符,所以你写的跨行匹配根本找不到目标内容——当前处理的行里不存在换行符。
给你两个直接可行的解决方案:
方案1:一次性读取整个文件处理
用-0777选项将输入记录分隔符设为undef,让Perl把整个文件当作单个内容块读取,这样就能轻松匹配跨行内容:
perl -0777 -pi -w -e 's/bad\n/good/g;' ~/Documents/*.md
如果需要兼容Windows格式的换行(\r\n),可以用\R代替\n,它能匹配任何类型的换行符:
perl -0777 -pi -w -e 's/bad\R/good/g;' ~/Documents/*.md
方案2:适合大文件的跨行处理
如果文件体积过大,一次性读入内存不划算,可以通过手动取消逐行分隔来实现:
perl -pi -w -e 'BEGIN{undef $/} s/bad\n/good/g;' ~/Documents/*.md
这个写法和-0777效果一致,都是让Perl不再逐行切割文件内容。
另外注意:不要直接在shell单引号内换行写匹配模式,虽然语法上允许,但解决不了逐行处理的核心问题,调整Perl的读取模式才是关键。
内容的提问来源于stack exchange,提问作者Sal
相关产品推荐
相关产品推荐

