2017-09-25 73 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__,但不与其子索引类似于数组变量。