web-dev-qa-db-ja.com

grepを使用して、特殊文字を含む可能性のある文字列のすべての部分文字列を見つける

Grepを使用して、ファイル内の文字列「crk」を見つけようとしています。私は文字列がフォームのCソースファイルに存在することを知っています

kop.crk_op = CRK_MOD_EXP;

ただし、を使用して検索する場合

 grep -rnw --include '*.c' '.' -e "crk"

空の結果が得られます。この線

 grep -rnw --include '*.c' '.' -e "crk_op"

うまく動作しますが、それは私には本当に役に立ちません。 「_」文字が何らかの形で検索を台無しにしていると思います。 「_」文字やその他の文字が存在する場合でも、「crk」が部分文字列であるすべての文字列に一致するようにアプローチを変更するにはどうすればよいですか?

編集:私はこの投稿で少しトリガー幸せになったようです。コマンド

grep -rnw --include '*.c' '.' -e "[^ ]*crk[^ ]*"

動作するようです。あるいは、誰かが余分なワイルドカードが必要な理由を説明できますか?

2
Aroto

-wオプションは、grepが単語を探すようにするため、非Word文字で囲まれている場合はcrkを表示します。 man grep から:

-w、--Word-regexp 
完全な
単語を形成する一致を含む行のみを選択します。テストでは、一致する部分文字列は、行の先頭に
があるか、Word 
以外の構成文字が前にある必要があります。同様に、行の末尾
または非単語構成文字が続く必要があります。
単語構成文字は、文字、数字、 
アンダースコア

_はWord文字であるため、crk_opcrk-wに一致しません。

複雑な正規表現"[^ ]*crk[^ ]*"は、grepが必要とするWord境界の間にスペース以外の文字をいくつでも許可するため、機能します。

ただやる:

grep -rn --include '*.c' . -e crk

そこにある現在のディレクトリに対して.をqouteする必要はありません。

3
muru