我有一点grep的问题,我似乎无法弄明白。我正在尝试搜索一组源文件中用双引号(C字符串)括起来的小写单词的所有实例。使用bash和gnu grep:
grep -e '"[a-z]+"' *.cpp
给我没有比赛,而
grep -e '"[a-z]*"' *.cpp
给了我像“Abc”这样的比赛,这不仅仅是小写字符。什么是正确的正则表达式只匹配“abc”?
答案 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:]]\+"'