我对 grep 有点问题,我似乎无法弄清楚。我正在尝试在一组源文件中搜索用双引号(C 字符串)括起来的所有小写单词实例。使用 bash 和 gnu grep:
grep -e '"[a-z]+"' *.cpp
不给我火柴,而
grep -e '"[a-z]*"' *.cpp
给我像“Abc”这样的匹配,而不仅仅是小写字符。什么是仅匹配“abc”的正确正则表达式?
您忘记转义元字符。
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 语言环境中,[ad] 等效于 [abcd]。许多语言环境按字典顺序对字符进行排序,在这些语言环境中,[ad] 通常不等同于 [abcd];例如,它可能等同于 [aBbCcDd]。要获得括号表达式的传统解释,可以通过将 LC_ALL 环境变量设置为值 C 来使用 C 语言环境。
屏蔽 +
grep -e '"[a-z]\+"' *.cpp
或使用 egrep:
egrep '"[a-z]+"' *.cpp
也许你有 -E 的想法:
grep -E '"[a-z]+"' *.cpp
例如,小写字母 -e 用于指定多个搜索模式。
大写字符的现象可能来自您的语言环境 - 您可以通过以下方式防止:
LC_ALL=C egrep '"[a-z]+"' *.cpp
您可能需要转义+
:
grep -e '"[a-z]\+"' *.cpp
如果您不想弄乱语言环境,这对我有用:
grep -e '"[[:lower:]]\+"'