如何用Bash+Perl逐行统计每行的正则匹配次数?
逐行统计每行匹配次数的Perl实现
问题背景
需要在Bash环境下用Perl逐行统计文件中每行的匹配次数(以示例文件中的.为例)。
示例文件 ~/test.txt 内容:
one.two.three.four one.two.three.four one.two.three.four one.two.three.four
原命令(统计全文件匹配总数):
perl -0777snE 'my @count = /\./gm; say scalar @count' -- ~/test.txt
原命令返回结果:
12
期望输出(逐行统计结果):
3 3 3 3
解决方案
原命令中 -0777 参数会让Perl将整个文件读取为单个字符串,因此统计的是全局匹配总数。要实现逐行统计,只需移除该参数,让Perl默认逐行处理输入,再对每行单独计算匹配次数。
简洁版命令
perl -nE 'say scalar(() = /\./g)' -- ~/test.txt
直观版命令
perl -nE 'my @matches = /\./g; say scalar @matches' -- ~/test.txt
命令说明
-n:让Perl自动循环读取输入的每一行,对每行执行一次代码块,无需手动编写循环逻辑。/\./g:在当前行中全局匹配所有.,返回所有匹配结果的列表。scalar(() = /\./g):利用Perl的列表上下文特性,将匹配结果赋值给空列表时,会返回匹配的数量,再通过scalar转为标量输出。
内容的提问来源于stack exchange,提问作者Mario Palumbo
相关产品推荐
相关产品推荐

