Saya ingin tahu aturan umum untuk menggunakan ekspresi reguler di klausa if di bash?
Berikut ini contohnya
$ gg=svm-grid-ch
$ if [[ $gg == *grid* ]] ; then echo $gg; fi
svm-grid-ch
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi
$
Mengapa tiga yang terakhir gagal cocok?
Semoga Anda bisa memberikan aturan umum sebanyak mungkin, tidak hanya untuk contoh ini.
Menggunakan
=~
untuk ekspresi reguler periksa Daftar Isi Tutorial Ekspresi Reguler
sumber
if [[ $gg =~ ^....grid.* ]]
sumber
Menambahkan solusi ini dengan
grep
dansh
bawaan dasar untuk mereka yang tertarik dengan solusi yang lebih portabel (terlepas daribash
versi; juga bekerja dengan yang lamash
, pada platform non-Linux dll.)# GLOB matching gg=svm-grid-ch case "$gg" in *grid*) echo $gg ;; esac # REGEXP if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi # Extended REGEXP if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then echo $gg fi
Beberapa
grep
inkarnasi juga mendukung opsi-q
(senyap) sebagai alternatif untuk pengalihan/dev/null
, tetapi pengalihan sekali lagi adalah yang paling portabel.sumber
grep -q
sebagai gantigrep >/dev/null
.@OP,
Tidak, pola "glob" tidak hanya digunakan untuk nama file. Anda juga dapat menggunakannya untuk membandingkan string. Dalam contoh Anda, Anda dapat menggunakan case / esac untuk mencari pola string.
gg=svm-grid-ch # looking for the word "grid" in the string $gg case "$gg" in *grid* ) echo "found";; esac # [[ $gg =~ ^....grid* ]] case "$gg" in ????grid*) echo "found";; esac # [[ $gg =~ s...grid* ]] case "$gg" in s???grid*) echo "found";; esac
Regex lebih fleksibel dan "nyaman" daripada "pola glob", namun kecuali Anda melakukan tugas kompleks yang tidak dapat disediakan oleh "globbing / extended globbing", maka tidak perlu menggunakan regex. Regex tidak didukung untuk versi bash <3.2 (seperti yang disebutkan dennis), tetapi Anda masih dapat menggunakan extended globbing (dengan menyetel
extglob
). untuk globbing yang diperluas, lihat di sini dan beberapa contoh sederhana di sini .Pembaruan untuk OP: Contoh untuk menemukan file yang dimulai dengan 2 karakter (titik "." Berarti 1 karakter) diikuti dengan "g" menggunakan regex
misalnya keluaran
$ shopt -s dotglob $ ls -1 * abg degree ..g $ for file in *; do [[ $file =~ "..g" ]] && echo $file ; done abg degree ..g
Di atas, file dicocokkan karena namanya berisi 2 karakter diikuti oleh "g". (yaitu
..g
).Persamaannya dengan globbing akan menjadi seperti ini: (lihat referensi untuk arti
?
dan*
)$ for file in ??g*; do echo $file; done abg degree ..g
sumber
ls ..g
tidak bekerja. Anda memberi tahu shell untuk mencari file yang diberi nama..g
. Seperti untuk belajar tentang sintaks regex, Anda dapat mencobaperldoc perlretut
,perldoc perlrequick
atau melakukaninfo sed
pada baris perintah.