grep无法识别[A-Z] +

时间:2016-09-13 17:10:16

标签: regex grep

$ grep 'tableName="' db.changelog.xml
    <createTable tableName="MY_TABLE" schemaName="public">

$ grep 'tableName="[A-Z_]+"' db.changelog.xml

第二个grep不会返回任何内容。那是为什么?

这是默认配置的LANG。

$ echo $LANG
en_US.UTF-8
$ grep --version
grep (GNU grep) 2.24
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

2 个答案:

答案 0 :(得分:5)

在基本正则表达式(BRE)模式下,+被解释为文字字符。

您有几种选择:

  • 使用grep -E启用扩展正则表达式支持
  • 在BRE模式下使用\{1,\}表示一个或多个(符合POSIX标准,适用于任何grep)
  • 使用\+,GNU grep理解为在BRE模式下一个或多个

答案 1 :(得分:1)

你需要做

grep 'tableName="[A-Z_]\+"' db.changelog.xml

即。在\之前添加+。如果您发现这种反直觉,则可以使用扩展正则表达式或perl样式的正则表达式,分别带有标志-E-P,例如

grep -P 'tableName="[A-Z_]+"' db.changelog.xml