grep有多个$

时间:2017-09-25 18:07:56

标签: regex bash grep

我正在为数组变量搜索一些php代码文件,我遇到了一个我很想理解的问题。

我试图grep:

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

它没有返回任何内容。但是,如果我逃脱第二个美元符号,它会找到具有该模式的行。

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

手册页中的-F标志表示它将模式视为固定字符串而不是正则表达式。它似乎只处理第一个美元符号。

请帮助我理解grep如何解释此命令。这可能是一个shell问题而不是正则表达式问题吗?

UPDATE 添加了一个额外的数组图层,显示了我不想使用单引号的原因。逃避单引号的工作比美元符号还要多。

2 个答案:

答案 0 :(得分:2)

使用单引号而不是双引号。双引号让shell扩展以$开头的变量名:

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

对于已修改的问题,您可以在双引号内使用转义$

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

答案 1 :(得分:0)

我认为您打算使用两个子索引值搜索某些数组变量的出现,并且您不知道方括号对于grep是特殊的,这意味着一类字符。如果您想将${array_variable}名称和${key_variable}值替换为grepclassión,您最好使用完整的语法,但最重要的是如果您想要字面上匹配[]括号,您需要逃避它们。如在

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

(只需要转义左方括号) 在这种情况下,如果您有foo存储在变量array_variable中的barkey_variable,那么实际的grep命令将是

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

随着转义到括号,正则表达式将搜索foo的出现,然后是'somk_y之一,然后是bar之一,如foo'r或{{1但是,没有任何类似于带有子索引的数组变量。