Perl \s元字符遇空行不匹配问题求助
问题分析与解决
问题原因
你使用的perl -00参数是段落模式,这个模式下Perl会将**一个或多个纯空行(仅包含换行符\n的行)**作为段落分隔符,把文件内容拆分成多个段落处理。
从十六进制dump可以看到:
./c/d/m.txt的结构是hello\n \n\n peppa\n,中间的\n\n是两个纯换行,属于段落分隔符,因此Perl会把文件拆成两个独立段落:hello\n和peppa\n。此时正则/hello\s+peppa/无法匹配,因为hello和peppa不在同一个段落(即同一个$_变量)中。./c/d/b.txt的结构是hello\n \n \n peppa\n,中间的\n \n是换行+空格+换行,不是纯空行,所以整个文件内容被当作一个段落,$_包含全部文本,正则能匹配到hello与peppa之间的所有空白字符。
解决办法
将段落模式替换为读取整个文件的模式,使用-0777参数代替-00,这样$_会包含文件的全部内容,无论中间的空行类型如何,正则都能跨空行匹配:
find . -name "*.txt" -type f -exec perl -0777 -ne 'print "$ARGV\n" if ($_ =~ /hello\s+peppa/msi);' {} \;
如果你的场景需要保留段落模式,那需要调整匹配逻辑,但针对当前需求(匹配文件中是否存在hello和peppa的关联),-0777是最简洁有效的方案。
内容的提问来源于stack exchange,提问作者Demeter P. Chen
相关产品推荐
相关产品推荐

