Bash 从文件中提取 10 个最常见的双元音单词的脚本

Bash script to extract 10 most common double-vowels word form a file

所以我尝试编写一个 Bash 脚本来从文件中提取 10 个最常见的双元音单词,例如 good、teeth 等。 这是我目前所拥有的:

grep -E -o '[aeiou]{2}' |tr 'A-Z' 'a-z' |sort|uniq -c|sort -n | tail -10

我尝试使用带有标志 E 的 grep,然后找到模式匹配,例如 'aa'、'ee'、'ii' 等,但它根本不起作用, enter image description here,我得到的,就是'ai','ea',类似这样的东西。谁能帮我弄清楚如何在 bash 脚本中进行模式匹配?

更改正则表达式的简单方法:将 [aeiou]{2} 替换为 aa|ee|ii|oo|uu。 (这不能解决只找到匹配项而不是完整词的问题。)

基于安德鲁的回答(回复:匹配双元音):

$ cat words.txt
good food;foul make chicken,eek too brave
eye you yuu something:three food too tu too

$ grep -E -o '\<[[:alnum:]]*(aa|ee|ii|oo|uu)[[:alnum:]]*\>' words.txt
good
food
eek
too
yuu
three
food
too
too

grep 仅查找包含字母 and/or 数字 的单词(\<\> 表示单词边界)双元音,将每个单词打印在单独的行上。

应用 OP 的其余 counting/sorting 逻辑:

$ grep -E -o '\<[[:alnum:]]*(aa|ee|ii|oo|uu)[[:alnum:]]*\>' words.txt | sort | uniq -c | sort -n
      1 eek
      1 good
      1 three
      1 yuu
      2 food
      3 too

您可以简单地将重复元音之前或之后的任意数量的字母与此 POSIX ERE 正则表达式与 GNU grep:

匹配
grep -oE '[[:alpha:]]*([aeiou])[[:alpha:]]*' words.txt

FreeBSD (non-GNU) grep 不支持模式中的反向引用,因此您必须列出所有可能的元音序列:

grep -oE '[[:alpha:]]*(aa|ee|ii|oo|uu)[[:alpha:]]*' words.txt

参见 online demo:

#!/bin/bash
s='Some good feed
Soot and weed'
grep -oE '[[:alpha:]]*([aeiou])[[:alpha:]]*' <<< "$s"

详情:

  • [[:alpha:]]* - 零个或多个字母
  • (aa|ee|ii|oo|uu) - 字符序列之一,aaeeiioouu| 是 POSIX ERE 正则表达式中的交替运算符)
  • ([aeiou]) - 第 1 组:元音
  • </code> - 与组 1</li> 中的元音相同 <li><code>[[:alpha:]]* - 零个或多个字母

见图: