两个元音完全相同的Grep单词

两个元音完全相同的Grep单词,grep,aix,Grep,Aix,我有以下问题,我需要从一个文件中检索所有恰好包含2个元音(以任何顺序)的单词。该文件每行仅包含一个单词 我目前的解决办法是: Grep1:检索单词,如earth、over、under、one… grep -i "^[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words > A.txt grep -i "^[^aeiou][^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words >

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

我目前的解决办法是:

Grep1:检索单词,如
earth、over、under、one…

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

Grep2:检索单词,如
无格式、深沉、说话人…

 grep -i "^[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words  > A.txt
 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
我认为问题在于我在expression中实现了
^$
,但我尝试了不同的版本,但没有成功

任何帮助都将不胜感激


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

因为
*
可以匹配0次或更多次,所以您应该能够以
[^aeiou]*
开始字符串:尝试

"^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$"
至于修复正则表达式,我认为您需要以
\\\124;
的形式避开这个条,所以

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

由于
*
可以匹配0次或更多次,因此您应该能够以
[^aeiou]*
开始字符串:重试

"^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$"
至于修复正则表达式,我认为您需要以
\\\124;
的形式避开这个条,所以

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

如果您不介意
Perl
,可以使用以下方法:

perl -lne '$m=$_; tr/[aeiou]//cd; print $m if length()==2;' /usr/share/dict/words
那就是说。。。“以$m保存当前行(单词)。删除所有非元音的内容。如果还有两个内容(即元音),请打印原始单词。”

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


您可以在
awk

中执行几乎相同的操作,如果您不介意
Perl
,您可以使用以下方法:

perl -lne '$m=$_; tr/[aeiou]//cd; print $m if length()==2;' /usr/share/dict/words
那就是说。。。“以$m保存当前行(单词)。删除所有非元音的内容。如果还有两个内容(即元音),请打印原始单词。”

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


awk

中,你可以做几乎相同的事情,你很接近。这应该起作用:

grep -i "^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words  > A.txt
因此,它应该找到所有八种可能性(两个元音识别三个非元音序列,每个可能为空;2^3是8):

至于连接,|需要转义。您可以使用单个锚定:

 ^(regexp1\|regexp2)$

你很接近。这应该起作用:

grep -i "^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$" genesis.words  > A.txt
因此,它应该找到所有八种可能性(两个元音识别三个非元音序列,每个可能为空;2^3是8):

至于连接,|需要转义。您可以使用单个锚定:

 ^(regexp1\|regexp2)$

如果您能够使用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
words=/path/to/words.txt
在阅读电子单词时;做
v=$(echo$word | tr-cd'aeiou'| wc-c)
[[!$v-eq“2”]| | echo$word>>output.txt
已完成<$words

这将逐行读取原始文件,计算元音并返回结果,结果仅为2到output.txt。

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
words=/path/to/words.txt
在阅读电子单词时;做
v=$(echo$word | tr-cd'aeiou'| wc-c)
[[!$v-eq“2”]| | echo$word>>output.txt
已完成<$words

这将逐行读取原始文件,计算元音并返回结果,结果只有2到output.txt。

这说明了为什么
Perl
有时是一种非常棒的语言+1您提到了
awk
,尽管使用其中一种方法比使用另一种方法有任何优势吗?我想,至少对我来说,Perl的优势在于,它在Linux、Unix、OSX、Windows中完全相同-只有一个标准正则表达式语法,只有一个一致的文件命名约定,一组标准化的行尾,一组转义,只要一个日期语法,只要一个
find
语法,它就完成了
tr
所能做的一切,
sed
awk
所能做的一切,
grep
fgrep
,CPAN……这说明了为什么
Perl
有时是一种非常棒的语言+1您提到了
awk
,尽管使用其中一种方法比使用另一种方法有任何优势吗?我想,至少对我来说,Perl的优势在于,它在Linux、Unix、OSX、Windows中完全相同-只有一个标准正则表达式语法,只有一个一致的文件命名约定,一组标准化的行尾,一组转义,只要一个日期语法,只要一个
find
语法,它就完成了
tr
所能做的一切,
sed
awk
所能做的一切,
grep
fgrep
,CPAN…谢谢!你的解决方案很有魅力!至于连接,我应用了你的建议,但仍然没有返回任何内容。谢谢!你的解决方案很有魅力!至于连接,我应用了你的建议,但仍然没有返回任何结果。感谢diff方法-但是我没有想到这种方法,因为这通常是从命令行运行的(quick&dirty)在这种情况下,grep将是最好的选择。感谢diff方法-我没有想到这种方法,但是因为它通常是从命令行(quick&dirty)运行的,grep将是这种情况下的最佳选择。