Como posso grep para uma string contendo metacaracteres de regex como $ e '?

4

Eu quero pesquisar todos os arquivos no diretório atual e abaixo para a substring $form['#node'] . Então, eu tentei, inicialmente:

grep -R "\$form\[\\'" . e grep -R "\$form\[\'" .

Mas não retorna nenhum resultado. No entanto,

grep -R "\$form\[" retorna muitos resultados, pois há instâncias de entradas como $form['#id'] ou $form['#node'] nos arquivos. Existe alguma razão pela qual a adição da citação única com escape cause um problema? Não consigo encontrar nenhuma indicação clara de como exatamente escapar uma única citação neste caso.

Preciso verificar se meus caracteres de escape estão funcionando como pretendido neste cenário.

    
por njp 07.11.2013 / 16:43

4 respostas

6

Acho que se você usar o swtich -F , instruirá grep a procurar sequências de caracteres fixas.

$ grep -F "\$form['#node']" file.txt

Exemplo

Arquivo de amostra.

$ cat file.txt
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']
someotherstring

Execução de amostra.

$ grep -F "\$form['#node']" file.txt 
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']

OBSERVAÇÃO: você ainda precisa escapar do cifrão $ porque as aspas duplas que envolvem a string são fracas e não protegem contra o shell, Bash, por achar que é um nome de variável.

    
por 07.11.2013 / 16:51
2

Embora seja um caso em que você deseja usar -F aqui, o único caractere que é especial sem -F aqui é [ , então é o único que precisa de escape para grep , $ precisa ser escapado para o shell, mas não para grep , embora $ é um operador de regex, não está nessa posição. [ é um operador de shell globbing, mas não dentro de aspas duplas

grep -r "\$form\['#node']" .

deve funcionar. Claro, como apontado por @slm, não há razão para não usar -F aqui.

grep -Fr "\$form['#node']" .

(com GNU grep (pelo menos versões recentes), -r deve ser preferido sobre -R a menos que você pretenda atravessar links simbólicos).

    
por 07.11.2013 / 17:04
0

que tal isso?

egrep "\\$form\['"
    
por 07.11.2013 / 16:51
0

As aspas simples não têm significado especial nas expressões regulares e, como seu padrão já está entre aspas duplas, não há motivo para evitá-las. Como eles não são caracteres especiais, o escape deles não funciona e estraga seu padrão.

Portanto, tudo que você precisa é de "\$form\['" :

$ cat file.txt 
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']
someotherstring

$ grep  "\$form\['" file.txt 
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']
    
por 07.11.2013 / 17:01