为什么grep -n“[^ aeiou] +”返回不包含元音的行?

时间:2017-03-15 15:07:12

标签: regex grep

我使用termux在Android上运行bash shell

目标是打印其中不包含任何元音的字符或单词。

键入的cmd序列:

$ cat f4
a
b
c
bb
$ grep -n "[^aeiou]+" f4
$

无法理解为什么正则表达式没有给出预期的输出。

2 个答案:

答案 0 :(得分:3)

实际上在GNU grep中,您不需要为-E启用扩展正则表达式支持,只需转义+即可剥夺其特殊含义

grep -n "[^aeiou]\+" file
2:b
3:c
4:bb

从页面Basic vs Extended Regular Expressions

引用
  

在基本的正则表达式中,元字符'?','+','{','|','('和')'失去了它们的特殊含义;而是使用反斜杠版本'\?','\ +','\ {','\ |','\('和'\''。

     

传统的egrep不支持'{'元字符,而一些egrep实现支持'{',所以可移植脚本应避免使用'{''grep -E'模式,并应使用'[{]'来匹配文字'{'。

此外,您只需在-E, --extended-regexp中为该

启用GNU grep标记即可
grep -En "[^aeiou]+" file
2:b
3:c
4:bb

请参阅嵌入式链接中的Bracket Expressions

答案 1 :(得分:1)

首先:+是ERE扩展名。构建等效的BRE命令可能如下所示:

grep '[^aeiou]\{1,\}$'

...或者您可以添加-E参数或使用egrep来启用此类扩展。

第二:如果你的目的是找到带有 no 元音的单词,而不是简单地包含至少一个非元音字符的单词,你需要锚定你的正则表达式:

grep '^[^aeiou]\{1,\}$'

或作为ERE,

grep -E '^[^aeiou]+$'

前面的^和后面的$是锚点:它们确保你匹配的东西从行的开头一直到它的结尾,而不是比行中某处的那样。