Coincidir con grep cuando el patrón contiene guiones "-"

11

Escribí el siguiente comando para hacer coincidir $ a con $ b, pero cuando el valor incluye "-", aparece un error. ¿Cómo puedo evitar eso?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
yael
fuente
3
Considere cambiar su comando para grep -Fxc -- "$b" <<< "$a"evitar la tubería innecesaria
h3rrmiller
8
Por cierto, ¿realmente quieres una coincidencia de expresiones regulares, o simplemente quieres probar si una cadena es igual a (o es una subcadena de) otra cadena? En ese caso, el shell integrado [[ ... ]]o casesería una mejor opción, ya que evita tanto las idiosincrasias echocomo los procesos secundarios.
Uwe
si una cadena es igual esta es mi prueba
yael
Otra alternativa que no debe usar es que nadie figura en la lista: es posible escapar del guión dentro de una cadena entre comillas para que se entienda grepcomo un carácter literal en lugar del comienzo de una opción, es decir echo test-test | grep "\-test", coincidirá en lugar de quejarse de una -tbandera desconocida .
Aaron

Respuestas:

20

Coloque --antes de su patrón:

echo "$a"  | grep -Fxc -- "$b"

-- especifica las opciones de fin de comando para muchos comandos / funciones integradas de shell, después de lo cual los argumentos restantes se tratan como argumentos posicionales.

sebasth
fuente
13

Además de la gran respuesta de @ sebasth , podría decir que PATTERN con la grep's -e opción de usar PATTERN como patrón (aquí usando el <<< zshoperador here-string en lugar de echo; vea también la printf '%s\n' "$a"portabilidad).

grep -Fxc -e "$b" <<<"$a"

O todo al lado de otras opciones.

grep -Fxce "$b" <<<"$a"

Como su objetivo es la comparación de igualdad de cadena byte a byte, use el [comando en su lugar.

if [ "$a" = "$b" ]

O si $acontiene $b, usando la [[...]]construcción ksh:

if [[ $a == *"$b"* ]]

O más portátil en todos los proyectiles tipo Bourne:

case $a in
  *"$b"*) ...
esac
αғsнιη
fuente
==no es estándar para el [comando; Es un bashismo . Usar en su =lugar.
Comodín