【问题标题】:Grep pattern matching lower case string enclosed in double quotesGrep 模式匹配用双引号括起来的小写字符串
【发布时间】:2012-05-10 18:41:30
【问题描述】:

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

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

不给我匹配,而

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

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

【问题讨论】:

  • 你的第二个正则表达式看起来不错。我试过了,它与大写字符不匹配。
  • @Mike 你忘记了特定于区域设置的整理顺序。
  • @Don 谢谢,没想到!

标签: regex string grep


【解决方案1】:

您忘记转义元字符。

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];例如,它可能等同于 [aBbCcDd]。获得传统的解释 括号表达式,您可以通过将 LC_ALL 环境变量设置为值 C 来使用 C 语言环境。

【讨论】:

  • 是的,愚蠢的语言环境。另外,为什么我必须逃避+?我会认为,如果我想要一个文字 + 我会转义它并且裸 + 将被视为元字符。
  • 在基本的正则表达式中,元字符?、+、{、|、(和)失去了它们的特殊意义;而是使用反斜杠版本\?、\+、\{、\|、(和)。要获得扩展的正则表达式,请使用 -E
【解决方案2】:

屏蔽 +

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 是 egrep。我想我错了。
  • 是的,我也是这么想的,但是由于我的习惯是使用 egrep,所以我测试 egrep 时并没有仔细研究 -e 选项,并且在使用 egrep 成功后,我意识到 -e应该做类似的事情——我也是这么想的。但正确的选项是 -E,大写 E。请在手册页中自行查找 -e。
【解决方案3】:

你可能需要转义+:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 2013-12-16
      • 1970-01-01
      相关资源
      最近更新 更多