Cocokkan dengan grep saat polanya berisi tanda hubung “-”


11

Saya menulis perintah berikut untuk mencocokkan $ a dengan $ b, tetapi ketika nilainya termasuk "-", maka saya mendapatkan kesalahan. Bagaimana saya bisa menghindarinya?

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

3
Pertimbangkan mengubah perintah Anda grep -Fxc -- "$b" <<< "$a"untuk menghindari pipa yang tidak perlu
h3rrmiller

8
Omong-omong, apakah Anda benar-benar menginginkan kecocokan regex, atau apakah Anda hanya ingin menguji apakah suatu string sama dengan (atau merupakan substring dari) string lain? Dalam hal ini, shell built-in [[ ... ]]atau caseakan menjadi pilihan yang lebih baik, karena Anda menghindari kedua kekhasan echodan proses anak.
Uwe

apakah string sama dengan ini adalah tes saya
yael


Alternatif lain yang tidak boleh Anda gunakan yang tidak ada yang terdaftar: adalah mungkin untuk melarikan diri tanda hubung di dalam string yang dikutip sehingga dipahami grepsebagai karakter literal daripada awal opsi, yaitu echo test-test | grep "\-test"akan cocok daripada mengeluh tentang -tbendera yang tidak dikenal .
Aaron

Jawaban:


20

Tempatkan --sebelum pola Anda:

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

-- menentukan opsi opsi akhir untuk banyak perintah / built-in shell, setelah argumen yang tersisa diperlakukan sebagai argumen posisi.


13

Selain jawaban hebat @ sebasth , Anda bisa memberi tahu POLA itu dengan grep's -e opsi untuk menggunakan POLA sebagai pola (di sini menggunakan <<< zshoperator di sini-string alih-alih echo; lihat juga printf '%s\n' "$a"untuk portabilitas).

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

Atau semua selain opsi lain.

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

Karena tujuan Anda adalah perbandingan kesetaraan string byte-ke-byte, gunakan [perintah sebagai gantinya.

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

Atau jika $amengandung $b, menggunakan [[...]]konstruk ksh:

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

Atau lebih mudah dibawa dalam semua cangkang mirip Bourne:

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

==bukan standar untuk [perintah; itu bashism . Gunakan =sebagai gantinya.
Wildcard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.