Bash正则表达式:最多搜索3个连续的元音

时间:2018-07-16 13:54:01

标签: regex linux bash grep

我正在尝试最多搜索3个连续元音

我尝试了

grep -E "([AEIOUaeiou]{3})" gpl3.txt

得到结果

enter image description here

我想要的是不要获得您在输出的第一行中看到的( aaaaaaaaa )。所有其他输出正确。

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

如果要避免使用-P选项并提前行,则可以使用类似以下的内容。

grep -iE '(^|[^aeiou])[aeiou]{3}([^aeiou]|$)' gpl3.txt

它刚刚匹配

  • 行首或非元音
  • 三个元音
  • 非元音或行尾

试运行:

IT070137 ~/tmp $ cat gpl3.txt
aaaaaaaaaaaaaaa
asdaiosd
aa
aaa
aaaa
this is a righteous queue
IT070137 ~/tmp $ grep -E '(^|[^aeiou])[aeiou]{3}([^aeiou]|$)' gpl3.txt
asdaiosd
aaa
this is a righteous queue

答案 1 :(得分:2)

尝试使用否定的超前预测,断言四个或多个元音不会连续出现:

grep -P "^(?!.*[AEIOUaeiou]{4,}).*$" gpl3.txt

我们需要在Perl模式下运行此命令,以使用否定先行。

Demo

答案 2 :(得分:2)

如果您想找到所有恰好出现的三个元音(不多也不少),则可以尝试以下模式:

grep -iP '(?<![aeiou])[aeiou]{3}(?![aeiou])'

使用选项-P使grep将Perl库用于正则表达式,它比标准的regexp库具有更多的功能。例如,它知道模式(?<!something) (?!something)的意思是“一定不要在某事之前”和“一定不要在某事之后” , 分别。我用这个来表达:

»查找长为三个元音且没有前一个元音且不后跟一个元音的东西。«这是另一种说法,»长为三个元音«。

关于可移植性:您需要使用grep来使用Perl正则表达式。今天,我想这将不再是问题,但是如果您碰巧为历史机器编码,则需要先检查一下。