两个元音完全相同的Grep单词
我有以下问题,我需要从一个文件中检索所有恰好包含2个元音(以任何顺序)的单词。该文件每行仅包含一个单词 我目前的解决办法是: Grep1:检索单词,如两个元音完全相同的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 >
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将是这种情况下的最佳选择。