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

时间:2012-05-10 18:41:31

标签: regex string grep

我有一点grep的问题,我似乎无法弄明白。我正在尝试搜索一组源文件中用双引号(C字符串)括起来的小写单词的所有实例。使用bash和gnu grep:

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

给我没有比赛,而

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

给了我像“Abc”这样的比赛,这不仅仅是小写字符。什么是正确的正则表达式只匹配“abc”?

4 个答案:

答案 0 :(得分:8)

你忘了逃避元字符。

grep -e '"[a-z]\+"'

对于第二部分,匹配多案例字符的原因是您的语言环境。如下:

$ echo '"Abc"' | grep -e '"[a-z]\+"'
"Abc"
$ export LC_ALL=C
$ echo '"Abc"' | grep -e '"[a-z]\+"'
$

要获得“ascii-like”行为,您需要将语言环境设置为“C”,如grep手册页中所指定:

  

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

答案 1 :(得分:1)

掩盖+

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

或使用egrep:

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

也许你有-E记:

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

例如,使用小写-e来指定多个搜索模式。

大写字符的现象可能来自您的语言环境 - 您可以使用以下方法阻止:

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

答案 2 :(得分:0)

您可能需要转义+

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

答案 3 :(得分:0)

如果你不想弄乱语言环境,这对我有用:

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