2012-02-23 12 views
52

Necesito buscar una variable de PHP $someVar. Sin embargo, Grep piensa que estoy tratando de ejecutar una expresión regular protestó:Grep no como una expresión regular

$ 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">> 

no veo una opción para contar grep no de interpretar la cadena como una expresión regular, pero para incluir el $ como solo otro personaje de cuerdas.

+0

En esta pregunta, el problema principal no es sobre 'grep' interpretando' $ 'como una expresión regular. Se trata de que el intérprete de comandos sustituya '$ someVar' con el valor de la variable de entorno' someVar', probablemente sea la cadena vacía. El segundo ejemplo no debe devolver todas las filas con 'someVar' sino todas las líneas, porque la cadena vacía está en todas las líneas. Para decirle al shell que no lo sustituya, debe usar ''$ someVar'' o' \ $ someVar'. Entonces tendrás que lidiar con la interpretación 'grep' del carácter' $ '. –

+1

@ ChristopheDrevet-Droguet: ¡Gracias por la explicación, estaba desconcertado con respecto al voto a favor! Su comentario es lo suficientemente informativo para ser una respuesta, de hecho sería una de las mejores respuestas en la página si es así. – dotancohen

Respuesta

7

Escapar el $ poniendo un \ delante de él.

+4

O bien, '... | grep '$ someVar'' –

188

Uso fgrep (en desuso), grep -F o grep --fixed-strings, para que sea el patrón de tratar como una lista de cadenas fijas, en lugar de una expresión regular.

Para referencia, la documentación menciones (extractos):

-F--fixed-strings interpretar el patrón como una lista de fijos cadenas (en lugar de expresiones regulares), separadas por saltos de línea, cualquier de los cuales es para ser emparejado (-F es especificado por POSIX.)

fgrep es lo mismo que grep -F. La invocación directa como fgrep es obsoleta, pero se proporciona para permitir que las aplicaciones históricas que dependen de se ejecuten sin modificaciones.

Para la referencia completa, verificar: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

+17

Esta debería ser la respuesta aceptada. –

+0

simple gran respuesta. – breadmj

+0

De acuerdo: cuando usa variables, no puede hacer algo como '' addslashes() 'de PHP en bash. Esta es la forma más simple de hacerlo. – geerlingguy

43

grep -F es una forma estándar para contar grep de interpretar el argumento como una cadena fija, no un patrón.

+1

En serio, esta debería haber sido la respuesta aceptada. – dotslash

+0

Buena respuesta. Solucionó mi problema cuando busqué una cadena con $ usando el comando ssh. Escapar con "\" no funcionó en ese escenario. Pero -F flag hizo el truco. – Rajasekhar

7

usted tiene que decir grep se utiliza una cuerda fija, en lugar de un patrón, utilizando '-F':

grep -ir "Something Here" * | grep -F \$somevar 
1

En esta cuestión, la cuestión principal no se trata de interpretar grep$ como una expresión regular . Se trata de la shell que sustituye $someVar por el valor de la variable de entorno someVar, probablemente la cadena vacía.

Por lo tanto, en el primer ejemplo, es como llamar a grep sin ningún argumento, y es por eso que le da una salida de usage. El segundo ejemplo no debe devolver todas las filas que contengan someVar sino todas las líneas, porque la cadena vacía está en todas las líneas.

Para indicar al shell que no lo sustituya, debe usar '$someVar' o \$someVar. Luego, tendrá que lidiar con la interpretación grep del carácter $, de ahí la opción grep -F que se brinda en muchas otras respuestas.

Así que una respuesta válida sería:

grep -ir "Something Here" * | grep '$someVar' 
1

+1 para la opción -F, que será la respuesta aceptada. Además, tuve un comportamiento "extraño" al buscar el patrón -I.. en mis archivos, ya que el -I se consideró como una opción de grep; para evitar ese tipo de errores, podemos especificar explícitamente el final de los argumentos del comando usando --.

Ejemplo:

grep -HnrF -- <pattern> <files> 

la esperanza de que va a ayudar a alguien.

+0

¿Qué es F? –

+0

De http://www.gnu.org/software/grep/manual/grep.html: "-F: interpreta el patrón como una lista de cadenas fijas (en lugar de expresiones regulares), separadas por líneas nuevas, cualquiera de las cuales es para ser emparejado. (-F es especificado por POSIX.) " –

+0

Si se usa' --', ¿se puede omitir '-HnrF'? – Daniel

Cuestiones relacionadas