Grep no como una expresión regular

96

Necesito buscar una variable PHP $someVar. Sin embargo, Grep piensa que estoy tratando de ejecutar una expresión regular y se queja:

$ 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 decirle a grep que no interprete la cadena como una expresión regular, sino que la incluya $como otro carácter de cadena.

dotancohen
fuente
3
En esta pregunta, el problema principal no se trata de grepinterpretar $como una expresión regular. Se trata de que el shell sustituya $someVarel valor de la variable de entorno someVar, probablemente la cadena vacía. El segundo ejemplo no debería devolver todas las filas con someVartodas las líneas, porque la cadena vacía está en todas las líneas. Para decirle al caparazón que no sustituya, debe usar '$someVar'o \$someVar. Entonces tendrás que lidiar con la grepinterpretación del $personaje.
Christophe Drevet-Droguet
1
@ ChristopheDrevet-Droguet: Gracias por la explicación, ¡estaba desconcertado por el voto negativo! Su comentario es lo suficientemente informativo como para ser una respuesta; de hecho, sería una de las mejores respuestas en la página si es así.
dotancohen

Respuestas:

-8

Escapa del $poniendo un \delante de él.

Señor lister
fuente
299

Utilice fgrep(obsoleto), grep -Fo grep --fixed-strings, para que trate el patrón como una lista de cadenas fijas, en lugar de una expresión regular.

Como referencia, la documentación menciona (extractos):

-F --fixed-stringsInterprete el patrón como una lista de cadenas fijas (en lugar de expresiones regulares), separadas por líneas nuevas, cualquiera de las cuales debe coincidir. (-F lo especifica POSIX).

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

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

Hasturkun
fuente
gran respuesta simple.
breadmj
De acuerdo, cuando estás usando variables no puedes hacer algo como PHP addslashes()en bash. Esta es la forma más sencilla de hacerlo.
geerlingguy
1
Gracias, esto funcionó. Recordatorio: si usa comillas dobles, aún tendrá que escapar de$ , por ejemplo:, de lo grep -FR "unset(\$foo['bar'])"contrario, cree que es una variable externa e intenta expandirla
aexl
57

grep -Fes una forma estándar de decir grepque interprete un argumento como una cadena fija, no como un patrón.

rkhayrov
fuente
1
En serio, ¡esta debería haber sido la respuesta aceptada!
ankush981
Buena respuesta. Resolvió mi problema cuando busco una cadena con $ usando el comando ssh. Escapar con "\" no funcionó en ese escenario. Pero la bandera -F hizo el truco.
Rajasekhar
8

Tienes que decirle a grep que usas una cadena fija, en lugar de un patrón, usando '-F':

grep -ir "Something Here" * | grep -F \$somevar
huelbois
fuente
3

En esta pregunta, el problema principal no se trata de grepinterpretar $como una expresión regular. Se trata de que el shell sustituya $someVarel valor de la variable de entorno someVar, probablemente la cadena vacía.

Entonces, en el primer ejemplo, es como llamar grepsin ningún argumento, y por eso te da una usagesalida. El segundo ejemplo no debería devolver todas las filas que contienen, someVarsino todas las líneas, porque la cadena vacía está en todas las líneas.

Para decirle al caparazón que no sustituya, debe usar '$someVar'o \$someVar. Luego, tendrá que lidiar con la interpretación grep del $personaje, de ahí la grep -Fopción dada en muchas otras respuestas.

Entonces, una respuesta válida sería:

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

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

Ejemplo:

grep -HnrF -- <pattern> <files>

Espero que ayude a alguien.

Aloïké Go
fuente
¿Qué significa F?
Arnold Roa
De gnu.org/software/grep/manual/grep.html : "-F: Interprete el patrón como una lista de cadenas fijas (en lugar de expresiones regulares), separadas por nuevas líneas, cualquiera de las cuales debe coincidir. (-F es especificado por POSIX.) "
Aloïké Go
Si --se usa, ¿se -HnrFpuede omitir?
Daniel
@Daniel Depende de lo que se quiera hacer: -Fevita interpretar el patrón como una expresión regular, mientras que --evita interpretar los elementos que le siguen como opciones de grep.
Aloïké Go
@ AloïkéGo Gracias, lo entiendo.
Daniel