Abbina a grep quando il pattern contiene il trattino "-"


11

Ho scritto il seguente comando per far corrispondere $ a a $ b, ma quando il valore include "-", viene visualizzato un errore. Come posso evitarlo?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified

3
Considera di cambiare il tuo comando per grep -Fxc -- "$b" <<< "$a"evitare la pipa non necessaria
h3rrmiller,

8
A proposito, vuoi davvero una corrispondenza regex o vuoi solo verificare se una stringa è uguale (o è una sottostringa di) un'altra stringa? In tal caso, la shell è integrata [[ ... ]]o casesarebbe una scelta migliore, poiché si evitano sia le idiosincrasie echoche i processi figlio.
Uwe,

se una stringa è uguale questo è il mio test
yael


Un'altra alternativa che non dovresti usare e che nessuno ha elencato: è possibile sfuggire al trattino all'interno di una stringa tra virgolette in modo che sia inteso grepcome un carattere letterale piuttosto che l'inizio di un'opzione, cioè echo test-test | grep "\-test"corrisponderà piuttosto che lamentarsi di una -tbandiera sconosciuta .
Aaron,

Risposte:


20

Posiziona --prima del tuo schema:

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

-- specifica le opzioni di fine comando per molti comandi / incorporati shell, dopo di che gli argomenti rimanenti vengono trattati come argomenti posizionali.


13

Oltre alla grande risposta di @ sebasth , potresti dire a PATTERN con l' grep's -e opzione di usare PATTERN come modello (qui usando l' <<< zshoperatore qui-string invece di echo; vedi anche printf '%s\n' "$a"per la portabilità).

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

O tutti accanto ad altre opzioni.

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

Poiché il tuo obiettivo è il confronto di uguaglianza stringa byte-byte, utilizza [invece il comando.

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

O se $acontiene $b, usando il [[...]]costrutto ksh:

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

O più portabilmente in tutte le conchiglie tipo Bourne:

case $a in
  *"$b"*) ...
esac

==non è standard per il [comando; è un bashismo . Usa =invece.
Carattere jolly
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.