2012-05-10 5 views
9

grepにはわかりにくい問題があります。私は、ソースファイルのセットで二重引用符(C文字列)で囲まれた小文字の単語のすべてのインスタンスを検索しようとしています。 bashのとGNU grepの使用:grepパターンの一致小文字の文字列を二重引用符で囲みます

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

は私に何の一致を与えない、

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

ながらすることは、私はちょうど小文字ではありません "ABC" のように一致しています。 "abc"だけに一致する正規表現は何ですか?

+0

2番目の正規表現は正常です。私はそれを試して、それは大文字の文字と一致しません。 – Misha

+1

@ロケール固有の照合順序を忘れています。 –

+0

@Donありがとう、それについても考えなかった! – Misha

答えて

8

LC_ALL=C egrep '"[a-z]+"' *.cpp 
+0

うん、愚かなロケール。また、なぜ私は+をエスケープする必要がありますか?私は文字通り+私がそれをエスケープし、裸の+がメタキャラクターとみなされると思っていました。 –

+1

基本正規表現では、?、+、{、|、(、および)のメタ文字は特殊な意味を失います。代わりにバックスラッシュバージョン\ ?, \ +、\ {、\ |、\(、\)を使用してください。拡張正規表現を取得するには-E –

+0

-Eを使用してください。古い習慣は激しく死ぬ。 –

1

はマスク+

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

またはegrepを使用します。

egrep '"[a-z]+"' *.cpp 

は、多分あなたは心の中で-Eを持っていた:

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

小文字-eが使用され、例えば、複数の検索パターンを指定できます。

ロケールからの起源があります大文字のphaenomenon - あなたが防ぐことができます:あなたは脱出するために忘れている

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

私はgrep -eがegrepだと思いました。私は間違っていたと思う。 –

+0

はい、私もそう思っていましたが、私の習慣はegrepを使うことなので、-eオプションに近づかずにegrepをテストしました。そしてegrepで成功した直後に、-eは同様のことをする必要があります。同じと思った。しかし、正しいオプションは-Eで、大文字のEです。マンページで自分自身を参照してください。 –

0

あなたはおそらく+をエスケープする必要がありますメタ文字。

grep -e '"[a-z]\+"' 

2番目の部分では、ロケールが原因で複数の文字が一致する理由があります。次のように:

$ echo '"Abc"' | grep -e '"[a-z]\+"' 
"Abc" 
$ export LC_ALL=C 
$ echo '"Abc"' | grep -e '"[a-z]\+"' 
$ 

「アスキー様」の挙動を取得するには、grepのmanページで指定され、「C」にロケールを設定する必要があります。

角括弧式の中では、範囲式はハイフンで区切られた2つの文字で構成されます。ロケールの照合順序と文字セットを使用して、2文字の間でソートする任意の単一の文字 に一致します。たとえば、デフォルトのCロケールの では[a-d]は[abcd]と等価です。多くのロケールは辞書順に文字を並べ替えますが、これらのロケールでは[abcd]と通常は等価ではない です。たとえば、[aBbCcDd]と同等である可能性があります。あなたはロケールと約台無しにしたくない場合は ブラケット式の伝統的な解釈を得るために、あなたが値C

0

にLC_ALL環境変数を設定することで、Cロケールを使用することができ、これは私のために働いていました:

grep -e '"[[:lower:]]\+"' 
関連する問題