如何用正则匹配单行单个字母?如何用grep统计指定编程语言出现次数?
刚好对正则和shell命令这块比较熟,来帮你搞定这两个问题:
问题1:如何编写正则表达式以匹配单行中的单个字母?
这里分两种常见场景,你可以根据实际需求选择:
场景1:整行仅包含一个字母(无其他任何字符)
用这个正则就可以:^[a-zA-Z]$
拆解一下:^锁定行的起始位置,[a-zA-Z]匹配任意一个大小写英文字母,$锁定行的结束位置,确保整行除了这个字母没有别的内容。场景2:单行中独立存在的单个字母(比如被空格、标点或数字包围)
如果你要匹配的是不与其他字母相邻的单个字母,推荐用:(?<![a-zA-Z])[a-zA-Z](?![a-zA-Z])
解释:(?<![a-zA-Z])是反向预查,保证字母前面不是其他字母;(?![a-zA-Z])是正向预查,保证字母后面也不是其他字母,这样就能精准匹配独立的单个字母。
要是你用的工具支持单词边界(比如grep、Perl这类),也可以简化成:\b[a-zA-Z]\b
注意:\b会把数字、下划线这类也当作“非单词字符”,所以字母旁边是这些字符时也会被匹配,按需选择就行。
问题2:统计指定编程语言出现次数的单行命令
这里有两个关键细节要注意:一是C++里的+是正则元字符,必须转义;二是要先匹配C++再匹配C,不然C会先吃掉C++里的第一个C,导致统计结果出错。
直接给你能用的单行命令:
grep -o -E 'C\+\+|Ada|Pascal|Scheme|C' your_document.txt | sort | uniq -c
逐个解释下每个部分的作用:
-o:让grep只输出每个匹配到的内容(而非整行),这样每个匹配项单独占一行,方便后续统计-E:启用扩展正则,这样我们能直接用|来分隔多个匹配模式'C\+\+|Ada|Pascal|Scheme|C':匹配规则,优先匹配C++(转义成C\+\+),再匹配其他语言sort:把所有匹配结果排序,让相同的语言名称集中在一起uniq -c:统计每个重复项的出现次数,输出格式是「次数 语言名称」
如果你的文档里有大小写混合的情况(比如c++、ADA),可以加-i开启大小写不敏感匹配,同时调整sort和uniq的参数:
grep -o -i -E 'C\+\+|Ada|Pascal|Scheme|C' your_document.txt | sort -f | uniq -ic
内容的提问来源于stack exchange,提问作者Andres ZW
相关产品推荐
相关产品推荐

