Desende "-" tire işareti varsa grep ile eşleştirin


12

$ A ile $ b eşleştirmek için aşağıdaki komutu yazdım, ancak değer "-" içerdiğinde, bir hata alıyorum. Bundan nasıl kaçınabilirim?

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

3
grep -Fxc -- "$b" <<< "$a"Gereksiz borudan kaçınmak için komutunuzu değiştirmeyi düşünün
h3rrmiller

8
Bu arada, gerçekten bir normal ifade eşleşmesi mi istiyorsunuz, yoksa yalnızca bir dizenin başka bir dizeye eşit mi (veya alt dizesi mi) test etmek mi istiyorsunuz? Bu durumda, hem yerleşik özelliklerden hem de alt süreçlerden kaçındığınız için kabuk yerleşikleri [[ ... ]]veya casedaha iyi bir seçim olacaktır echo.
Uwe

bir dize eşit olup olmadığı bu benim test
yael


Listelenen kimseyi kullanmamanız gereken başka bir alternatif: alıntılanan bir dizenin içindeki tiredan kaçmak mümkündür, böylece grepbir seçeneğin başlangıcı yerine gerçek bir karakter olarak anlaşılır , yani echo test-test | grep "\-test"bilinmeyen bir -tbayraktan şikayet etmek yerine eşleşir .
Aaron

Yanıtlar:


21

Yerleştirin --deseniniz önce:

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

-- birçok komut / kabuk yerleşik için komut sonu seçeneklerini belirtir, bundan sonra kalan bağımsız değişkenler konumsal bağımsız değişken olarak değerlendirilir.


13

@ Sebasth'ın büyük cevabının yanı sıra, PATTERN'yigrep's -e desen olarak kullanma seçeneğine sahip PATTERN'nin (burada, <<< zshburada string yerine operatörü kullanarak echo; printf '%s\n' "$a"taşınabilirlik için de bakınız ) söyleyebilirsiniz .

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

Ya da diğer seçeneklerin yanında.

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

Hedefiniz bayt-bayt dize eşitliği karşılaştırması olduğundan , [bunun yerine komutu kullanın.

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

Veya eğer $aiçeriyor $bkullanarak, [[...]]Ksh yapısı:

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

Veya Bourne benzeri tüm mermilerde daha taşınabilir:

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

==[komut için standart değildir ; bu bir bashizmdir . =Bunun yerine kullanın .
Wildcard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.