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.