Dopasuj do grep, gdy wzór zawiera łącznik „-”

11

Napisałem następujące polecenie, aby dopasować $ a do $ b, ale gdy wartość zawiera „-”, to pojawia się błąd. Jak mogę tego uniknąć?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
Yael
źródło
3
Rozważ zmianę polecenia, aby grep -Fxc -- "$b" <<< "$a"uniknąć niepotrzebnej rury
h3rrmiller
8
Nawiasem mówiąc, czy naprawdę chcesz dopasowania wyrażenia regularnego, czy po prostu chcesz przetestować, czy ciąg znaków jest równy (lub stanowi podciąg) innego ciągu? W takim przypadku, powłoka wbudowane ins [[ ... ]]lub casebyłoby lepszym wyborem, ponieważ można uniknąć zarówno dziwactw echoi procesów potomnych.
Uwe
czy ciąg znaków jest równy, to mój test
yael
Inna alternatywa, której nie powinieneś używać, której nikt nie wymienił na liście: można uciec od myślnika wewnątrz cytowanego ciągu, więc jest rozumiany grepraczej jako dosłowny znak niż początek opcji, tzn. echo test-test | grep "\-test"Będzie pasował, a nie narzekał na nieznaną -tflagę.
Aaron

Odpowiedzi:

20

Umieść --przed wzorem:

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

-- określa opcje końca poleceń dla wielu poleceń / wbudowanych powłok, po czym pozostałe argumenty są traktowane jako argumenty pozycyjne.

sebasth
źródło
13

Oprócz świetnej odpowiedzi @ sebasth , możesz powiedzieć, że WZÓR z grep's -e opcją użycia WZORZEC jako wzorca (tutaj używając <<< zshoperatora ciąg-znaków zamiast echo; patrz także printf '%s\n' "$a"przenośność).

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

Lub wszystkie oprócz innych opcji.

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

Ponieważ twoim celem jest porównanie równości ciągu bajt po bajcie, [zamiast tego użyj polecenia.

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

Lub jeśli $azawiera $b, używając [[...]]konstrukcji ksh:

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

Lub bardziej przenośnie we wszystkich muszlach podobnych do Bourne'a:

case $a in
  *"$b"*) ...
esac
αғsнιη
źródło
==nie jest standardem dla [polecenia; to jest bashism . Użyj =zamiast tego.
Wildcard