RegEx:查找包含两个或更多字母的每个字符串

时间:2014-05-09 15:27:13

标签: regex sorting cygwin tr

我试图对cygwin中某些辅音群的频率进行排序。

首先使用的命令是:

tr 'a-zöäü' 'A-ZÖÄÜ' < text.txt | tr -sc 'BCDFGHJKLMNPQRSTVWXYZ' '\n' | 
sort | uniq -c | sort -nr

我认为它的作用:

将所有低级转换为大写,消除与第一个正则表达式不匹配的所有内容,并在每个字符串后打印一个新行。

它给了我一个这样的清单:

300 N
181 R
157 D
116 S
 91 T
 82 G
 81 M
 69 B
 65 ND

这已经相当不错了,但我只对两个以上字母的集群感兴趣(所以第一场对我来说很有趣的比赛就是'ND')。现在我试图用少于两个字母来强化每个字符串。

我尝试了什么:

 tr 'a-zöäü' 'A-ZÖÄÜ' < text.txt | tr -sc [BCDFGHJKLMNPQRSTVWXYZ]{2} '\n' | 
 sort | uniq -c | sort -nr

因为我认为添加{2}会匹配任何辅音组合,并拒绝单个字母颠倒我的列表(NRD ..) - 但实际上并没有改变任何东西,列表保持不变。

任何人都可以帮助我吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用grep:

进行后期处理
... | grep -E '[[:digit:]]+ [[:alnum:]]{2,}$'

这只会显示以两个或多个字符及其前面的数字结尾的行。

答案 1 :(得分:0)

使用一点Perl可以相当简单:

perl -ne '$_ = join("", <>); print map("$_\n", m/[[:alnum:]]{2,}/g)' < text.txt | \
    sort | uniq -c | sort -nr

让Perl进行计数和排序也会更有效:

perl -ne '$_ = join("", <>); for (m/[[:alnum:]]{2,}/g) { $m{$_}++ } END { print map("$m{$_}: $_\n", sort { $m{$a} <=> $m{$b} } keys %m) }' < text.txt

这个单行Perl脚本扩展并评论:

# match and iterate over alphabetic sequences of length >= 2
for (m/[[:alnum:]]{2,}/g) {
    # increment the count of the current item, building a map of counts
    $m{$_}++
}
END {
    # print the map as COUNT: ITEM, sorted by counted, descending
    print map("$m{$_}: $_\n", sort { $m{$a} <=> $m{$b} } keys %m)
}