我使用termux在Android上运行bash shell
目标是打印其中不包含任何元音的字符或单词。
键入的cmd序列:
$ cat f4
a
b
c
bb
$ grep -n "[^aeiou]+" f4
$
无法理解为什么正则表达式没有给出预期的输出。
答案 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]+$'
前面的^
和后面的$
是锚点:它们确保你匹配的东西从行的开头一直到它的结尾,而不是比行中某处的那样。