Ekspresi reguler VS Filename globbing

15

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?

Hamza
sumber

Jawaban:

19

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 ditentukan

Wildcard 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*bdengan nama file yang cocok. Sama berlaku untuk a*.txt. Jika tidak ada nama file yang cocok, shell akan meneruskan argumen grepseperti sebelumnya.

Namun, parameter pertama grepharus 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, grepakan 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.

janos
sumber
4

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.

tak seorangpun
sumber
tapi bagaimana perbedaan penerjemah * apakah itu seorang joker atau regex? misalnya: $ grep a "asterix" b a "asterix" .txt
Hamza
2
Jika Anda menggunakan find ./ -name 'a*'Anda menggunakan * sebagai wildcard. Saat Anda mengetik find ./ -regex 'a*', Anda menggunakan * dalam regex. Perbedaan penting adalah saklar -nameatau -regex.
tidak ada yang