Saya tahu bahwa ekspresi reguler hanya dapat digunakan dengan karakter dan string, tetapi terkadang saya menemukannya dalam nama file. Pertanyaan saya adalah: apakah regex hanya digunakan dengan karakter atau juga dengan nama file?
Ekspresi reguler dan globbing nama file adalah dua hal yang sangat berbeda.
Ekspresi reguler digunakan dalam perintah / fungsi untuk pencocokan pola dalam teks. Misalnya dalam parameter pola grep
, atau dalam bahasa pemrograman.
File globbing nama digunakan oleh shell untuk mencocokkan nama file dan direktori menggunakan wildcard. Kemampuan globbing tergantung pada shell. Bash, misalnya, mendukung wildcard seperti:
*
cocok dengan 0 karakter atau lebih?
mencocokkan 1 karakter[...]
cocok dengan karakter dalam set yang ditentukanWildcard ini mungkin terlihat mirip dengan ekspresi reguler, memang [...]
memiliki arti yang sama dalam globbing dan regex. Tapi *
dan ?
berarti hal yang berbeda di globbing dan regex.
Dalam komentar yang Anda tulis:
tapi bagaimana perbedaan penerjemah * apakah itu seorang joker atau regex? misalnya
grep a*b a*.txt
:?
Mudah. Semacam.
Pertama-tama, shell mencoba menafsirkan wildcard, dengan mencocokkannya dengan nama file. Jika ada file yang dimulai dengan "a" dan diakhiri dengan "b", shell akan diganti a*b
dengan nama file yang cocok. Sama berlaku untuk a*.txt
. Jika tidak ada nama file yang cocok, shell akan meneruskan argumen grep
seperti sebelumnya.
Namun, parameter pertama grep
harus berupa pola. Dalam 99,999% kasus penggunaan praktis Anda tidak ingin parameter pertama ditafsirkan oleh shell. Jadi kemungkinan besar niatnya adalah ini:
grep "a*b" a*.txt
Berkat mengutip a*b
, shell tidak akan mengartikannya menggunakan globbing, dan sebaliknya meneruskannya langsung ke grep
. Pada gilirannya, grep
akan menafsirkannya sebagai ekspresi reguler (dengan desain).
Singkatnya, shell menafsirkan baris perintah mengikuti bahasa globbing sendiri, yang menggunakan wildcard. Perintah, program menafsirkan parameter mereka dengan cara apa pun yang dirancang oleh penulisnya.
Jika nama file adalah string untuk Anda, Anda dapat menggunakan regex juga untuk nama file. Misalnya: jika Anda ingin mencari nama file yang cocok dengan regex Anda dapat mencoba:
find ./ -regex '.*[abc][xyz].*'
Perintah mencari file yang memiliki a, b atau c dalam nama diikuti oleh x, y atau z. Ini hanya satu contoh. Ada kemungkinan tak terbatas.
find ./ -name 'a*'
Anda menggunakan * sebagai wildcard. Saat Anda mengetikfind ./ -regex 'a*'
, Anda menggunakan * dalam regex. Perbedaan penting adalah saklar-name
atau-regex
.