¿Cómo puedo buscar una cadena que comienza con un guión / guión?


347

Quiero grep para la cadena que comienza con un guión / guión, como -Xen un archivo, pero es confuso como un argumento de línea de comando.

He intentado:

grep "-X"
grep \-X
grep '-X'

Respuestas:


465

Utilizar:

grep -- -X

Relacionado: ¿Qué significa un doble guión simple? (Gracias a nutty sobre natty ).


57
para aquellos de nosotros que nos preguntamos en este momento qué --significa o hace: unix.stackexchange.com/questions/11376/…
nutty about

2
Funciona con The Silver Searcher (ag) también.
Zev Eisenberg

Si desea usar con espacios variables, debe usar algo como esto:ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar O simplemente, grep -- "--name awesome".
Brett Widmeier

@BrettWidmeier, sí, no debería haber usado la variable, confunde a la gente.
zapstar

57

El guión es un carácter especial en Bash como se señala en http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Así que escapar de esto una vez solo te lleva a Bash, pero Grep todavía tiene su propio significado para guiones (al proporcionar opciones).

Entonces, realmente necesita escapar dos veces (si prefiere no usar las otras respuestas mencionadas). Lo siguiente debe / debería funcionar

grep \\-X
grep '\-X'
grep "\-X"

Una forma de probar cómo Bash pasa los argumentos a un script / programa es crear un script .sh que solo haga eco de todos los argumentos. Uso un script llamado echo-args.sh para jugar de vez en cuando, todo lo que contiene es:

echo $*

Lo invoco como:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Tienes la idea.


1
No creo, es un personaje especial en Bash a pesar de lo que dice la guía de ABS. Bash no procesa argumentos que comiencen de manera diferente a los demás. El comando o incorporado que Bash llama posteriormente manejará los argumentos que comiencen con un guión como lo considere conveniente. La mayoría de los comandos integrados de Bash y los comandos de Linux y GNU se manejan, como un terminador de opciones. Use 'set -x' para ver los comandos y argumentos que usa Bash antes de que se ejecuten, pero después de que Bash haya expandido escapes, globos y llaves. Grep es un ejemplo confuso porque maneja sus propios escapes de barra invertida.
Noah Spurrier

25

grep -e -X Hará el truco.


1
mi grep no tiene -e, muy raro
Mike

14
solaris para perder
Mike

2
Disponible en solaris desde / usr / xpg4 / bin / grep, por cierto. Muchas utilidades más completas en ese directorio.
pra

Funcionó bajo MinGW ( MinGW no es compatible -P(pero esa es otra historia y no se aplica aquí)).
Peter Mortensen


20
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X

7

No tengo acceso a una máquina Solaris, pero grep "\-X"funciona para mí en Linux.


5

La forma correcta sería usar "-" para detener el procesamiento de argumentos, como ya se mencionó. Esto se debe al uso de getopt_long (función C de GNU de getopt.h) en la fuente de la herramienta.

Es por eso que notas el mismo fenómeno en otras herramientas de línea de comandos; Como la mayoría de ellos son herramientas GNU, y usan esta llamada, exhiben el mismo comportamiento.

Como nota al margen, getopt_long es lo que nos da la buena opción entre -rlo y --really_long_option y la combinación de argumentos en el intérprete.


3

Si está utilizando otra utilidad que pasa un único argumento a grep, puede usar:

'[-]X'


-1
ls -l | grep "^-"

Espero que este sirva tu propósito.


2
Esta expresión captura solo líneas que comienzan con un guión. No cumple con la pregunta inicial. Él quiere buscar una cadena que comience por un guión, pero las líneas que contienen esta cadena no necesariamente comienzan con un guión. En la pregunta inicial, la cadena que comienza con un guión puede estar en cualquier lugar de la línea.
Laurent Simon

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.