用精确的两个元音grep单词

时间:2016-06-08 11:19:08

标签: grep aix

我有以下问题,我需要从文件中检索包含2个元音(按任意顺序)的所有单词。该文件每行只包含一个单词。

我目前的解决方法是:

Grep1:检索earth, over, under, one...

等字词
 grep -i "^[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words  > A.txt

Grep2:检索formless, deep, said...

等字词
 grep -i "^[^aeiou][^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words > B.txt

上面的解决方案有效,但是当我将两个正则表达式连接成一个正则表达式时,则不返回任何内容!

Grep1的母亲& Grep2:应该检索所有内容!

 grep -i "^[aeiou][^aeiou]*[aeiou][^aeiou]*$|^[^aeiou][^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words

我认为问题在于我在表达式中^$的实现,但尝试过没有成功的diff版本!

任何帮助都将受到高度赞赏!

操作系统是AIX 6100-09-04-1441

4 个答案:

答案 0 :(得分:1)

由于*可以匹配0次或更多次,您应该可以使用[^aeiou]*启动字符串:尝试

"^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$"

至于修复你的正则表达式,我认为你需要以\|来逃避吧,所以

grep -i "^[aeiou][^aeiou]*[aeiou][^aeiou]*$\|^[^aeiou][^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words

答案 1 :(得分:1)

如果你不介意Perl,你可以使用它:

perl -lne '$m=$_; tr/[aeiou]//cd; print $m if length()==2;' /usr/share/dict/words

那说...... "将当前行(字)保存在$ m。删除不是元音的所有内容。如果剩下两件事(即元音),则打印原始单词。"

请注意,我使用系统字典作为测试的输入。

你可以在awk中做同样的事情。

答案 2 :(得分:1)

你很亲密。这应该有效:

grep -i "^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words  > A.txt

所以它应该找到所有八种可能性(两个元音识别三个非元音序列,每个可能都是空的; 2 ^ 3是8):

     [ ]I[ ]o[ ]
     [ ]e[ ]a[r]
     [ ]e[r]a[ ]
     [ ]e[l]a[n]
     [T]e[ ]a[ ]
     [D]e[ ]a[r]
     [D]e[w]a[r]
     [D]a[w]a[ ]
     [H]a[w]a[y]

至于连接,|需要逃避。您可以使用单个锚点:

 ^(regexp1\|regexp2)$

答案 3 :(得分:1)

如果您能够使用grep tr替代wc,那么效果很好:

words=/path/to/words.txt

while read -e word ; do
    v=$(echo $word | tr -cd 'aeiou' | wc -c)
    [[ ! $v -eq "2" ]] || echo $word >> output.txt 
done < $words

这会逐行读取原始文件,计算元音和数字。只返回2到output.txt的结果。