¿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'
Miguel
fuente

Respuestas:

465

Utilizar:

grep -- -X

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

newacct
fuente
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.

Chad Gorshing
fuente
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.

Thomas
fuente
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
John Henry
fuente
7

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

ezpz
fuente
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.

fmmarques
fuente
3

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

'[-]X'
Colin vH
fuente
2

puedes usar nawk

$ nawk '/-X/{print}' file
ghostdog74
fuente
-1
ls -l | grep "^-"

Espero que este sirva tu propósito.

XINU
fuente
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
-1

grep "^ -X" archivo

Grep y seleccionará todas las líneas del archivo. ^ en el grep "^" indica una línea que comienza con

Sasank
fuente
1
Ya hay una respuesta que sugiere que stackoverflow.com/a/27440348/441757 (publicado hace más de un año)
sideshowbarker
El OP está buscando cadenas que comiencen -, no líneas.
codeforester