正規表現としてではないGrep


96

PHP変数を検索する必要があります$someVar。ただし、Grepは、私が正規表現を実行しようとしていると考えており、次のように不平を言っています。

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

文字列を正規表現として解釈せ$を別の文字列文字として含めるようにgrepに指示するオプションが表示されません。


3
この質問では、主な問題は正規表現としてgrep解釈することではありません$。これは、シェル$someVarが環境変数の値someVar(おそらく空の文字列)で置き換えられることに関するものです。2番目の例ではsomeVar、空の文字列がすべての行にあるため、すべての行を含むすべての行を返す必要はありません。シェルに置換しないように指示するには、'$someVar'またはを使用する必要があり\$someVarます。次にgrep$キャラクターの解釈に対処する必要があります。
Christophe Drevet-Droguet 2016年

1
@ ChristopheDrevet-Droguet:説明ありがとうございます、私は反対票について戸惑いました!あなたのコメントは答えになるのに十分な情報を提供します。実際、そうであれば、ページ上でより良い答えの1つになるでしょう。
dotancohen 2016年

回答:



298

使用fgrep(非推奨)、grep -Fまたはgrep --fixed-strings、それが代わりに正規表現の固定文字列のリストとしてパターンを扱うようにします。

参考までに、ドキュメントには次のように記載されています(抜粋)。

-F --fixed-stringsパターンを(正規表現ではなく)固定文字列のリストとして解釈し、改行で区切って、いずれかを一致させます。(-FはPOSIXで指定されています。)

fgrepと同じgrep -Fです。fgrepとしての直接呼び出しは非推奨ですが、それらに依存する履歴アプリケーションを変更せずに実行できるようにするために提供されています。

完全なリファレンスについては、https//www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.htmlを確認して ください。


シンプルで素晴らしい答え。
Broadmj 2016年

同意しました—変数を使用addslashes()している場合、bashでPHPのようなことを行うことはできません。これが最も簡単な方法です。
geerlingguy 2017年

1
ありがとう、これはうまくいきました。注意:二重引用符を使用する場合でも、たとえば:をエスケープする$必要がありますgrep -FR "unset(\$foo['bar'])"。それ以外の場合は、外部変数であると
見なし

57

grep -Fgrep引数をパターンではなく固定文字列として解釈するように指示する標準的な方法です。


1
真剣に、これは受け入れられた答えであるべきでした!
ankush981 2015

いい答えだ。sshコマンドを使用して$で文字列を検索すると、問題が解決しました。そのシナリオでは、「\」でのエスケープは機能しませんでした。しかし、-Fフラグでうまくいきました。
Rajasekhar 2015

8

'-F'を使用して、パターンの代わりに固定文字列を使用するようにgrepに指示する必要があります。

grep -ir "Something Here" * | grep -F \$somevar

3

この質問では、主な問題は正規表現としてgrep解釈することではありません$。これは、シェル$someVarが環境変数の値someVar(おそらく空の文字列)で置き換えられることに関するものです。

したがって、最初の例では、grep引数なしで呼び出すようなものであり、それがusage出力を提供する理由です。2番目の例ではsomeVar、空の文字列がすべての行にあるため、すべての行を含むすべての行を返す必要はありません。

シェルに置換しないように指示するには、'$someVar'またはを使用する必要があり\$someVarます。次に、$文字のgrep解釈を処理する必要があるため、grep -F他の多くの回答でオプションが提供されます。

したがって、1つの有効な答えは次のようになります。

grep -ir "Something Here" * | grep '$someVar'

2

-Fオプションの+1 、それは受け入れられた答えでなければなりません。また、;のオプションと見なされていた-I..ため、ファイル内のパターンを検索しているときに「奇妙な」動作-Iが発生しましたgrep。このようなエラーを回避するために、を使用してコマンドの引数の終わりを明示的に指定できます--

例:

grep -HnrF -- <pattern> <files>

それが誰かを助けることを願っています。


Fは何の略ですか?
アーノルドロア2016

gnu.org/software/grep/manual/grep.htmlから: "-F:パターンを(正規表現ではなく)固定文字列のリストとして解釈し、改行で区切ります。いずれも一致します。(-F POSIXによって指定される)」。
Aloïkéゴー

--を使用する場合、-HnrF省略できますか?
ダニエル

@Daniel何をしたいかによります:-Fパターンを正規表現として解釈する--ことを避け、それに続く要素をgrepのオプションとして解釈することを避けます。
Aloïkéゴー

@AloïkéGoありがとう、わかりました。
ダニエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.