Grep não é uma expressão regular

97

Preciso procurar uma variável PHP $someVar. No entanto, Grep acha que estou tentando executar uma regex e está reclamando:

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

Não vejo uma opção para dizer ao grep para não interpretar a string como um regex, mas incluir o $como apenas outro caractere da string.

dotancohen
fonte
4
Nesta pergunta, o principal problema não é grepinterpretar $como um regex. É sobre a substituição do shell $someVarpelo valor da variável de ambiente someVar, provavelmente a string vazia. O segundo exemplo não deve retornar todas as linhas com, someVarmas todas as linhas, porque a string vazia está em todas as linhas. Para dizer ao shell para não substituir, você deve usar '$someVar'ou \$someVar. Então você terá que lidar com a grepinterpretação do $personagem.
Christophe Drevet-Droguet
1
@ ChristopheDrevet-Droguet: Obrigado pela explicação, fiquei intrigado quanto ao voto negativo! Seu comentário é informativo o suficiente para ser uma resposta; na verdade, seria uma das melhores respostas na página se for o caso.
dotancohen

Respostas:

-7

Fuja do $colocando um \na frente dele.

Sr. Lister
fonte
303

Use fgrep(obsoleto), grep -Fou grep --fixed-strings, para fazer com que trate o padrão como uma lista de strings fixas, em vez de um regex.

Para referência, a documentação menciona (trechos):

-F --fixed-stringsInterprete o padrão como uma lista de strings fixas (em vez de expressões regulares), separadas por novas linhas, qualquer uma das quais deve ser correspondida. (-F é especificado por POSIX.)

fgrepé o mesmo que grep -F. A invocação direta como fgrep está obsoleta, mas é fornecida para permitir que aplicativos históricos que dependem deles sejam executados sem modificações.

Para obter a referência completa, verifique: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

Hasturkun
fonte
ótima resposta simples.
breadmj
Concordo - quando você está usando variáveis, não pode fazer algo como PHP addslashes()no bash. Esta é a maneira mais simples de fazer isso.
geerlingguy
1
Obrigado, isso funcionou. Lembrete: se estiver usando aspas duplas, você ainda terá que escapar de$ , por exemplo grep -FR "unset(\$foo['bar'])"
:,
59

grep -Fé uma maneira padrão grepde interpretar o argumento como uma string fixa, não um padrão.

rkhayrov
fonte
1
Sério, essa deveria ter sido a resposta aceita!
ankush981
Boa resposta. Isso resolveu meu problema quando pesquiso uma string com $ usando o comando ssh. Escapar com "\" não funcionou nesse cenário. Mas a bandeira -F fez o truque.
Rajasekhar
8

Você tem que dizer ao grep que usa uma string fixa, em vez de um padrão, usando '-F':

grep -ir "Something Here" * | grep -F \$somevar
Huelbois
fonte
3

Nesta pergunta, o principal problema não é grepinterpretar $como um regex. É sobre a substituição do shell $someVarpelo valor da variável de ambiente someVar, provavelmente a string vazia.

Portanto, no primeiro exemplo, é como chamar grepsem nenhum argumento, e é por isso que fornece uma usagesaída. O segundo exemplo não deve retornar todas as linhas contendo, someVarmas todas as linhas, porque a string vazia está em todas as linhas.

Para dizer ao shell para não substituir, você deve usar '$someVar'ou \$someVar. Então você terá que lidar com a interpretação grep do $caractere, daí a grep -Fopção dada em muitas outras respostas.

Portanto, uma resposta válida seria:

grep -ir "Something Here" * | grep '$someVar'
Christophe Drevet-Droguet
fonte
2

+1 para a -Fopção, será a resposta aceita. Além disso, tive um comportamento "estranho" ao pesquisar o -I..padrão em meus arquivos, pois o -Ifoi considerado uma opção de grep; para evitar esse tipo de erro, podemos especificar explicitamente o fim dos argumentos do comando usando --.

Exemplo:

grep -HnrF -- <pattern> <files>

Espero que ajude alguém.

Aloïké Go
fonte
o que F representa?
Arnold Roa
De gnu.org/software/grep/manual/grep.html : "-F: interpreta o padrão como uma lista de strings fixas (em vez de expressões regulares), separadas por novas linhas, qualquer uma das quais deve ser correspondida. (-F é especificado por POSIX.) "
Aloïké Go
Se --for usado, pode -HnrFser omitido?
Daniel
@Daniel Depende do que você deseja fazer: -Fevita interpretar o padrão como uma expressão regular, enquanto --evita interpretar os elementos que o seguem como opções de grep.
Aloïké Go
@ AloïkéGo Obrigado, entendi.
Daniel