2016-09-13 12 views
0
$ grep 'tableName="' db.changelog.xml 
    <createTable tableName="MY_TABLE" schemaName="public"> 

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

2番目のgrepは何も返しません。何故ですか?grepが[A-Z]を認識しない+

これは、デフォルトで設定されている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>. 

答えて

4

+はリテラル文字として解釈されます。

あなたは、いくつかのオプションがあります:拡張正規表現のサポートを有効にする

  • 使用grep -E
  • BREモードで一つ以上のを意味するのに使用\{1,\}(POSIX準拠の、いずれかのgrepの上で動作するはずです)
  • を BREモードで 一つ以上
を意味するGNUのgrepによって理解される
  • 使用\+
  • 1

    あなたは

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

    すなわち+\を追加を行う必要があります。これをcounter-intuitiveと見なす場合は、フラグ-E-Pをそれぞれ持つ、拡張正規表現またはperlスタイルの正規表現を使用できます。基本正規表現(BRE)モードで

    grep -P 'tableName="[A-Z_]+"' db.changelog.xml 
    
    関連する問題