一重引用符で囲まれた文字列をgrepに渡すには?

一重引用符で囲まれた文字列をgrepに渡すには?

私が期待するものは次のとおりです。ディレクトリを再帰的に検索して、見つかったすべてのファイルで指定された文字列を見つけます。次のコマンドは、一般的に使用される呼び出しポートです。

find ./ | xargs grep -ns 'foobar'

ただし、引用符を使用すると、シェルにプロンプ​​トが表示foobarされ、コマンドは失敗します。>問題を引き起こした特定のコマンドは次のとおりです。

find ./ | xargs grep -ns 'add_action(\'save_post\','

バックスラッシュを使用して引用符をエスケープしようとしましたが、役に立ちませんでした。これを行う正しい方法は何ですか?

答え1

一重引用符は一重引用符で終わり、その間にある他のすべての文字はバックスラッシュを含むままです。したがって、一重引用符の間に一重引用符を含めることはできません。 (しかし、あなたはできる'Single quotes aren'\''t ever really embedded in single quotes.'一重引用符を終了し、一重引用符をエスケープしてから、)のように新しい一重引用符セットを開始します。

提案:grep -r pattern .現在のディレクトリで繰り返しgrepを実行できる場合は、find + xargsを使用しないでください。

次のコマンドは同じ動作を持ちます。

grep -rns "add_action('save_post'," .
grep -rns 'add_action('\'save_post\', .

最後のコマンドは次のように解釈されます。

  1. 'add_action('->add_action(
  2. \'->'
  3. save_post->save_post
  4. \'->'
  5. ,->,

これらの部品を接続するために、grepコマンドはパラメータを受け取りますadd_action('save_post',

答え2

xargsパラメータが奇妙な方法で参照されると予想しましたが、find結果はそうではありません。ファイル名にスペースが含まれていないことがわからない場合は、xargswithを一緒に使用しないでください。find\"'

を使わずにxargsfind実行したいプログラムを直接呼び出します。

find . -exec grep -ns 'add_action('\''save_post'\'',' {} +

を使用すると、を使用するのexec … {} +と同じように、複数のファイルに対して同時に一度呼び出されますxargs。一部の以前のバージョンではこれをサポートfindしていないため、各ファイルに対して一度呼び出して使用する必要+があります。;grep

find … -print0 | xargs -0ユーティリティがそれをサポートしている場合は、そのユーティリティも使用できます。この-print0オプションは、findnullバイトで区切られた名前をエクスポートし、引用符を使用せずにnullで区切られた入力を期待するように-0指示します。xargs

上記の引用に注意してください。一重引用符の間のすべての文字は、'リテラル文字列の終わりを表す文字を除いて文字通り解釈されます。実際には、'\''一重引用符で囲まれた文字列を一重引用符で囲まれた文字列に入れる方法です。正式には、「'末尾引用符、\リテラル'一重引用符、'開始引用符」です。

の特別な場合grep、実装でサポートする場合、ディレクトリから再帰検索を省略してfind使用できます。grep -r

grep -r 'add_action('\''save_post'\'',' .

¹これらの機能は、Linux、Cygwin、FreeBSD、OSXでサポートされています。

答え3

grep "add_action('save_post'," ./* -R
  1. -Rこのオプションを使用して、現在のディレクトリ内のすべてのファイルに対して繰り返しgrepすることができます。

  2. 検索文字列はで囲むことができます"

関連情報