Regex Grep模式匹配用双引号括起来的小写字符串

Regex Grep模式匹配用双引号括起来的小写字符串,regex,string,grep,Regex,String,Grep,我和grep有点问题,我似乎不明白。我试图在一组源文件中搜索包含在双引号(C字符串)中的所有小写单词实例。使用bash和gnu grep: grep -e '"[a-z]+"' *.cpp 没有火柴,但是 grep -e '"[a-z]*"' *.cpp 给我类似“Abc”的匹配,它不仅仅是小写字符。什么是只匹配“abc”的适当正则表达式?屏蔽+ grep -e '"[a-z]\+"' *.cpp 或使用egrep: egrep '"[a-z]+"' *.cpp 也许你心里有-E: g

我和grep有点问题,我似乎不明白。我试图在一组源文件中搜索包含在双引号(C字符串)中的所有小写单词实例。使用bash和gnu grep:

grep -e '"[a-z]+"' *.cpp
没有火柴,但是

grep -e '"[a-z]*"' *.cpp
给我类似“Abc”的匹配,它不仅仅是小写字符。什么是只匹配“abc”的适当正则表达式?

屏蔽+

grep -e '"[a-z]\+"' *.cpp
或使用egrep:

egrep  '"[a-z]+"' *.cpp
也许你心里有-E:

grep -E '"[a-z]+"' *.cpp
例如,小写-e用于指定多个搜索模式

大写字符的phaenomenon可能来自您的区域设置-您可以通过以下方式防止:

LC_ALL=C egrep  '"[a-z]+"' *.cpp

您可能需要转义
+

grep -e '"[a-z]\+"' *.cpp

你忘了转义元字符

grep -e '"[a-z]\+"'
对于第二部分,它匹配多大小写字符的原因是因为您的区域设置。详情如下:

$ echo '"Abc"' | grep -e '"[a-z]\+"'
"Abc"
$ export LC_ALL=C
$ echo '"Abc"' | grep -e '"[a-z]\+"'
$
要获得“类似ascii”的行为,您需要将您的语言环境设置为“C”,如grep手册页中所指定:

在括号表达式中,范围表达式由两个 由连字符分隔的字符。它匹配任何单个字符 使用区域设置的排序序列和字符集在两个字符(包括)之间排序。例如,在 默认的C语言环境[a-d]相当于[abcd]。许多语言环境按字典顺序对字符进行排序,在这些语言环境中[a-d]是 通常不等同于[abcd];例如,它可能相当于[abbcdd]。要获得传统的解释 在括号表达式中,可以通过将LC_ALL环境变量的值设置为C来使用C语言环境


如果您不想在本地环境中捣乱,这对我很有用:

grep -e '"[[:lower:]]\+"'

你的第二个正则表达式看起来不错。我试过了,但它与大写字符不匹配。@迈克,你忘记了特定于区域设置的排序顺序。@Don,谢谢,我都没想过!是的,愚蠢的地方。还有,我为什么要逃避+?我会认为如果我想要一个literal+,我会转义它,一个bare+会被认为是元字符。在基本正则表达式中,元字符?、+、{、|、(、和)失去了它们的特殊意义;相反,使用反斜杠版本\?、\+、\{、\、\、\、(、和).为了得到扩展regexen,use-EI认为grep-e是egrep。我想我错了。是的,我也这么认为,但因为我的习惯是使用egrep,所以我在测试egrep时没有更接近-e选项,在成功使用egrep之后,我意识到,-e应该做类似的事情-我也这么认为。但正确的选项是-e,带有capital E。请在手册页中查找-E。