Seperti yang mungkin sudah Anda ketahui, banyak fitur yang didukung oleh mesin RegEx modern (referensi balik, pernyataan lookaround, dll.) Tidak didukung oleh mesin Bash RegEx. Berikut ini adalah skrip Bash sederhana yang baru saja saya buat untuk mencoba menjelaskan apa tujuan akhir saya:
#!/bin/bash
# Make sure exactly two arguments are passed.
if [ $# -lt 2 ]
then
echo "Usage: match [string] [pattern]"
return
fi
variable=${1}
pattern=${2}
if [[ ${variable} =~ ${pattern} ]]
then
echo "true"
else
echo "false"
fi
Jadi misalnya, sesuatu seperti perintah berikut ini akan kembali salah:
. match.sh "catfish" "(?=catfish)fish"
sedangkan ekspresi yang sama persis akan menemukan kecocokan saat digunakan dalam Perl atau penguji regex JavaScript.
Referensi balik (mis. (Expr1) (expr2) [] \ 1 \ 2) tidak akan cocok juga.
Saya hanya sampai pada kesimpulan bahwa masalah saya hanya akan diselesaikan ketika memaksa bash untuk menggunakan mesin RegEx yang kompatibel dengan Perl. Apakah ini bisa dilakukan? Jika demikian, bagaimana saya menjalankan prosedur?
sumber
grep
dengan-P
atau menggunakansed
?re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}
Jawaban:
Bash tidak mendukung metode bagi Anda untuk melakukan ini saat ini. Anda memiliki opsi berikut:
grep [-P|--perl-regexp]
Saya pikir saya akan pergi dengan # 2 dan mencoba dan gunakan
grep
untuk mendapatkan apa yang saya inginkan secara fungsional. Untuk referensi balik Anda dapat melakukan hal berikut dengangrep
:Referensi
sumber
[-P|--perl-regexp]
token. Terima kasih banyak :-)-P
opsi, dan itu tidak universal. Grep FreeBSD didasarkan pada GNU, tetapi dokumentasi menyatakan "Opsi ini tidak didukung dalam FreeBSD". Di OSX, grep juga didasarkan pada GNU, tetapi-P
opsi bahkan tidak disebutkan di halaman manual. Dan pada sistem unix lain yang grep bukan GNU, Anda tidak mungkin melihat-P
di mana pun. Jika ada kemungkinan jauh Anda bahwa portabilitas mungkin berguna bagi Anda di masa depan, saya sarankan menghindari opsi spesifik OS seperti ini.pcregrep
juga merupakan opsi, jika tersedia.REMATCH_PCRE
opsi tersebut ditetapkan.Orang bisa menggunakan
pcregrep
. Muncul dengan paketpcre
di CentOS danpcregrep
di Ubuntu.grep -P
dapat memiliki masalah ini tergantung pada OS / versi:sumber