2017-09-25 134 views
2

我在爲一個數組變量查找一些php代碼文件,並遇到了一個我很好奇的問題。

我試圖給grep:

grep -RF "$array_variable['some_key'][$key_variable]" * 

,並返回任何內容。但是,如果我逃過第二個美元符號,它就會找到具有該模式的線條。

grep -RF "$array_variable['some_key'][\$key_variable]" * 

手冊頁中的-F標誌表示它將模式視爲固定字符串而不是正則表達式。它似乎只處理第一個美元符號。

請幫我理解grep是如何解釋這個命令的。這可能是一個shell問題,而不是一個正則表達式問題?

UPDATE增加了一個額外的數組層,它顯示了爲什麼我不想使用單引號。逃避單引號比美元符號更重要。

+0

請參閱:[在bash中的單引號和雙引號之間的區別](http://stackoverflow.com/q/6697753/3776858) – Cyrus

+0

我認爲第一個$被視爲「行首」錨而不是字面值$。 –

+0

你打算做什麼'「$ array_variable ['some_key'] [$ key_variable]」'是什麼意思?您的問題包括簡潔,可測試的樣本輸入(包括任何變量的值)和預期輸出,然後有人可以幫助您。 –

回答

2

使用單引號而不是雙引號。雙引號讓外殼擴展變量名以$

grep -RF '$array_variable[$key_variable]' . 

爲了您編輯問題,您可以使用轉義雙引號內$

grep -RF "\$array_variable['some_key'][\$key_variable]" . 
+0

我已更新問題 –

+0

此外,shell不擴展$ array_variable變量 –

+0

Shell也擴展'$ array_variable',並且它擴展爲空字符串。但是,通過轉義的第二個'$',它實際上變成了'grep -RF'[$ key_variable]'。'並且你得到了結果。當兩個變量都展開時,它實際上變成了'grep -RF'[]'。',並且沒有發現任何東西。 – anubhava

0

我想你打算搜索對於有兩個子指針值的數組變量的出現,你不知道方括號對於grep是特殊的,意思是一類字符。如果要將${array_variable}名稱和${key_variable}值替換爲grepexpressión,最好使用完整的語法,但最重要的是,如果要直接匹配[]括號,則需要逃避他們。如在

grep -RF "${array_variable}\['some_key']\[${key_variable}]" 

(僅需要左方括號轉義) 在這種情況下,如果有,例如foo存儲在array_variablebar在可變key_variable,實際grep命令將是

greep -RF "foo\['some_key']\[bar]" 

withoug逃逸到支架,正則表達式將搜索FOO的出現次數,其次是'somk_y一個繼之以bar一個,像foo'rfoo__,但不與其子索引類似於數組變量。