Perl正则匹配空行提取含head的多行文本块问题求解
Perl按空行分块提取含指定关键词文本段实现
需求说明
输入文本以空行作为分隔符划分独立文本块,需要过滤掉所有不包含head关键词的文本块,仅保留含head行的完整文本块写入输出文件。
原有实现思路为将全量文本按换行符拆分为单行存入数组,逐行遍历匹配含head的内容输出,但拆分阶段遇到换行、空行的正则匹配问题,无法得到预期输出。
原有问题代码
my @arr = split(" ",$str); foreach my $token (@arr) { print "Inside for\n"; if($token =~ m[head]) { print "Inside if"; print $token; } }
示例文件
输入文件 InputFile.txt 内容
- text1 - text2 - head - text4 - text5 - non head - text8 - text9 - head
预期输出文件 OutputFile.txt 内容
- text1 - text2 - head - text8 - text9 - head
问题根因
- 拆分逻辑错误:按单个换行符拆分只能得到逐行的单行内容,匹配到
head时仅能输出当前行,无法带出同属一个块的其他关联行,不符合按块保留的需求 - 硬编码换行符兼容性差:不同操作系统的换行符存在差异(Windows为
\r\n、类Unix系统为\n),直接写换行符做分隔符容易出现拆分异常,也没有识别空行作为块分隔符的逻辑
修正实现
直接利用Perl内置的段落读取模式,按空行分块读取处理,不需要手动拆分换行、匹配空行:
# 设置输入记录分隔符为空,开启按段落(空行分隔块)读取模式 local $/ = ''; # 打开输入输出文件 open my $in, '<', 'InputFile.txt' or die "打开输入文件失败: $!"; open my $out, '>', 'OutputFile.txt' or die "打开输出文件失败: $!"; # 每次读取一个完整的空行分隔文本块 while (my $block = <$in>) { # 块内包含head关键词就整块写入输出 print $out $block if $block =~ /head/; } close $in; close $out;
逻辑说明
- 开启段落读取模式后,Perl会自动将连续1个及以上空行识别为块分隔符,自动兼容不同系统的换行符格式,不需要额外写正则匹配空行
- 直接以块为单位做关键词匹配,匹配通过就整块写入,不需要逐行拼接内容,逻辑更简洁也不会遗漏块内内容
内容的提问来源于stack exchange,提问作者Vinayak Shettigar
相关产品推荐
相关产品推荐

