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)
- 字符序列之一,aa
、ee
、ii
、oo
或 uu
(|
是 POSIX ERE 正则表达式中的交替运算符)
([aeiou])
- 第 1 组:元音
</code> - 与组 1</li> 中的元音相同
<li><code>[[:alpha:]]*
- 零个或多个字母
见图:
所以我尝试编写一个 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)
- 字符序列之一,aa
、ee
、ii
、oo
或uu
(|
是 POSIX ERE 正则表达式中的交替运算符)([aeiou])
- 第 1 组:元音</code> - 与组 1</li> 中的元音相同 <li><code>[[:alpha:]]*
- 零个或多个字母
见图: