Mit grep übereinstimmen, wenn das Muster einen Bindestrich "-" enthält.

11

Ich habe den folgenden Befehl geschrieben, um $ a mit $ b abzugleichen, aber wenn der Wert "-" enthält, wird eine Fehlermeldung angezeigt. Wie kann ich das vermeiden?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
Yael
quelle
3
grep -Fxc -- "$b" <<< "$a"
Erwägen
8
Wollen Sie übrigens wirklich eine Regex-Übereinstimmung oder möchten Sie nur testen, ob eine Zeichenfolge einer anderen Zeichenfolge entspricht (oder eine Teilzeichenfolge einer anderen Zeichenfolge ist)? In diesem Fall ist die Shell integriert [[ ... ]]oder casewäre eine bessere Wahl, da Sie sowohl die Eigenheiten echoals auch die untergeordneten Prozesse vermeiden .
Uwe
ob eine Zeichenfolge gleich ist, ist mein Test
Yael
Eine andere Alternative, die Sie nicht verwenden sollten, wenn niemand aufgelistet ist: Es ist möglich, den Bindestrich innerhalb einer Zeichenfolge in Anführungszeichen zu setzen, sodass er grepals wörtliches Zeichen und nicht als Beginn einer Option verstanden wird, dh echo test-test | grep "\-test"eher übereinstimmt als sich über eine unbekannte -tFlagge beschwert .
Aaron

Antworten:

20

Platzieren Sie --vor Ihrem Muster:

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

-- Gibt die Optionen für das Ende des Befehls für viele integrierte Befehle / Shell an. Danach werden die verbleibenden Argumente als Positionsargumente behandelt.

sebasth
quelle
13

Neben der großartigen Antwort von @ sebasth können Sie feststellen, dass PATTERN die grep's -e Option hat, PATTERN als Muster zu verwenden (hier mit dem <<< zshHere-String-Operator anstelle von echo; siehe auch printf '%s\n' "$a"Portabilität).

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

Oder alles neben anderen Optionen.

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

Da Ihr Ziel der Vergleich der Byte-zu-Byte- Zeichenfolgengleichheit ist, verwenden Sie [stattdessen den Befehl.

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

Oder wenn es $aenthält $b, verwenden Sie das [[...]]ksh-Konstrukt:

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

Oder tragbarer in allen Bourne-ähnlichen Muscheln:

case $a in
  *"$b"*) ...
esac
αғsнιη
quelle
==ist kein Standard für den [Befehl; Es ist ein Bashismus . Verwenden Sie =stattdessen.
Wildcard