如何將單引號的字串傳遞給 grep?

如何將單引號的字串傳遞給 grep?

我期望的結果如下:遞歸搜尋目錄,在所有找到的檔案中尋找給定的字串。以下命令是我常用的呼叫連接埠:

find ./ | xargs grep -ns 'foobar'

但是,當使用引號時,該命令會失敗並在 shell 中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不會產生。切勿xargs與 結合使用find,除非您知道檔案名稱不包含\"'空格。

我們不使用xargs,而是find直接呼叫您要執行的程式。

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

使用 時exec … {} +,程式會同時針對多個檔案呼叫一次,就像使用xargs.某些舊版本find不支援+此處,那麼您必須使用;它,grep每個檔案調用一次。

find … -print0 | xargs -0如果您的實用程式支持,您也可以使用。此-print0選項告訴find發出由空白位元組分隔的名稱,並-0告訴xargs期待空分隔的輸入並且不進行任何引號解釋。

請注意上面的引用:在單引號之間,所有字元均以字面解釋,但'表示文字字串結尾的字元除外。 So'\''實際上是一種將單引號文字放入單引號字串中的方法;形式上,它是“'結束引號,\文字'單引號,'開始引號”。

在 的特殊情況下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. 搜尋字串可以用 包圍"

相關內容