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.