Correspondance avec grep lorsque le motif contient un trait d'union «-»

11

J'ai écrit la commande suivante afin de faire correspondre $ a avec $ b, mais lorsque la valeur inclut "-", je reçois une erreur. Comment puis-je éviter cela?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
Yael
la source
3
Pensez à changer votre commande pour grep -Fxc -- "$b" <<< "$a"éviter le tuyau inutile
h3rrmiller
8
Soit dit en passant, voulez-vous vraiment une correspondance d'expression régulière, ou voulez-vous simplement tester si une chaîne est égale à (ou est une sous-chaîne) d'une autre chaîne? Dans ce cas, le shell intégré [[ ... ]]ou caseserait un meilleur choix, car vous évitez à la fois les particularités echoet les processus enfants.
Uwe
si une chaîne est égale c'est mon test
yael
Une autre alternative que vous ne devriez pas utiliser que personne n'a répertorié: il est possible d'échapper le tiret à l'intérieur d'une chaîne entre guillemets afin qu'il soit compris grepcomme un caractère littéral plutôt que le début d'une option, c'est-à-dire echo test-test | grep "\-test"qu'il correspondra plutôt que de se plaindre d'un -tindicateur inconnu .
Aaron

Réponses:

20

Placez --avant votre modèle:

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

-- spécifie les options de fin de commande pour de nombreuses commandes / commandes intégrées au shell, après quoi les arguments restants sont traités comme des arguments positionnels.

sebasth
la source
13

Outre la grande réponse de @ sebasth , vous pouvez dire que PATTERN avec l' grep's -e option d'utiliser PATTERN comme modèle (ici en utilisant l' <<< zshopérateur here-string au lieu de echo; voir aussi printf '%s\n' "$a"pour la portabilité).

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

Ou tout à côté d'autres options.

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

Puisque votre objectif est la comparaison d'égalité de chaîne octet à octet, utilisez [plutôt la commande.

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

Ou si $acontient $b, en utilisant la [[...]]construction ksh:

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

Ou plus facilement dans tous les obus de type Bourne:

case $a in
  *"$b"*) ...
esac
αғsнιη
la source
==n'est pas standard pour la [commande; c'est un bashisme . Utilisez =plutôt.
Wildcard