【问题标题】:RegEx: find every string with two or more lettersRegEx:查找包含两个或多个字母的每个字符串
【发布时间】:2014-05-09 15:27:12
【问题描述】:

我试图根据 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} 会匹配任何辅音组合,并排除影响我列表的单个字母 (N,R,D..) - 但实际上它并没有改变任何东西,列表保持不变。

谁能帮帮我?

已经谢谢了。

【问题讨论】:

    标签: regex sorting cygwin tr


    【解决方案1】:

    您可以使用 grep 进行后处理:

    ... | grep -E '[[:digit:]]+ [[:alnum:]]{2,}$'
    

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

    【讨论】:

    • 这已经很好了,但我想要两个或更多。我想我用{2,}而不是{2}得到这个,对吧?我认为这将使我在我的任务中取得进一步的进展,但知道一个匹配我想要的(两个或更多,但不是一个或没有)的正则表达式仍然很方便,因为我经常需要它
    • 逗号会做到这一点。更新
    【解决方案2】:

    使用一点 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2017-09-18
      相关资源
      最近更新 更多