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

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.


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

==nie jest standardem dla [polecenia; to jest bashism . Użyj =zamiast tego.
— Wildcard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.