Regex 所有元音按任何顺序排列的grep单词
基本上,我想知道是否有一种方法可以在单个grep命令中表示以下内容:Regex 所有元音按任何顺序排列的grep单词,regex,grep,Regex,Grep,基本上,我想知道是否有一种方法可以在单个grep命令中表示以下内容: grep "a" words.txt | grep "e" | grep "o" | grep "i" | grep "u" 按任意顺序查找包含5个元音的所有单词 我能想到的唯一方法是列出所有可能的组合,这真的很麻烦。您可以像这样使用awk检查所有元音: awk '/a/ && /e/ && /i/ && /o/ && /u/' words.txt 或者您可以
grep "a" words.txt | grep "e" | grep "o" | grep "i" | grep "u"
按任意顺序查找包含5个元音的所有单词
我能想到的唯一方法是列出所有可能的组合,这真的很麻烦。您可以像这样使用
awk
检查所有元音:
awk '/a/ && /e/ && /i/ && /o/ && /u/' words.txt
或者您可以使用grep-p
使用lookahead regex简化它:
grep -P "(?=[^a]*a)(?=[^e]*e)(?=[^i]*i)(?=[^o]*o)(?=[^u]*u)" words.txt
非常相似:@fedorqui,“按顺序”不同于“按任何顺序”@fedorqui我的问题是按“任何”顺序查找它们,而不是aeiou。你能解释一下
-P
标志的确切含义吗?-P
标志在现代grep
中用于PCRE regex功能。你为什么使用否定类?如果(?=[^a]*a)
那么(?=.*a)
@Bohemian:这不是我第一次讨论否定与非贪婪性能的比较。选中2个链接,并在这两个链接中单击regex debugger
。然后。你们会注意到,懒散量词在做同样的事情时要多走3倍的步骤。很有趣。我只是用java编写了一个小测试工具来比较两者的实际性能,因为我认为比较
要比[^a]
快。我的测试数据是10K个混合字母。当输入只有13个随机字母时,版本1((?=[^a]*a)
等)大约慢了50%,当使用全部26个字母时,版本2大约慢了10%,当使用更长的输入时,版本2大约慢了20%。总体而言,性能大致相同,(?=.*a)
版本在输入较短的情况下性能不佳,而(?=[^a]*a)
版本在输入较长的情况下性能略有提高