我期望的結果如下:遞歸搜尋目錄,在所有找到的檔案中尋找給定的字串。以下命令是我常用的呼叫連接埠:
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\', .
最後一條指令解釋為:
'add_action('
->add_action(
\'
->'
save_post
->save_post
\'
->'
,
->,
連接這些部分,該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
您可以使用
-R
選項遞歸地 grep 目前目錄中的所有檔案。搜尋字串可以用 包圍
"
。