Bagaimana persamaan reguler berbeda dari wildcard yang digunakan untuk memfilter file

15

Sementara kita menggunakan *untuk menunjukkan nol atau lebih karakter sebelumnya grep, kita menggunakan *.cuntuk menemukan semua file C ketika kita menggunakannya dengan lsperintah seperti ls *.c. Bisakah seseorang mengatakan bagaimana penggunaan *berbeda dalam dua kasus ini?

user3539
sumber

Jawaban:

30

Penggambaran nama file shell dan ekspresi reguler menggunakan beberapa karakter yang sama, dan mereka memiliki tujuan yang sama, tetapi Anda benar, mereka tidak kompatibel. Nama file globbing adalah sistem yang jauh lebih kuat.

Dalam globbing nama file:

  • * berarti "nol karakter atau lebih"

  • ? berarti "sembarang karakter tunggal"

Tetapi dalam regex, Anda harus menggunakan yang .*berarti "nol atau lebih karakter", dan .berarti "setiap karakter tunggal." A ?berarti sesuatu yang sangat berbeda di regex: nol atau satu contoh elemen RE sebelumnya.

Kurung kotak ( []) tampaknya berfungsi sama di kedua sistem pada sistem yang saya ketikkan ini, setidaknya untuk kasus sederhana. Ini termasuk hal-hal seperti kelas karakter POSIX (mis [:alpha:].). Yang mengatakan, jika Anda memerlukan perintah Anda untuk bekerja pada banyak jenis sistem yang berbeda, saya sarankan agar tidak menggunakan apa pun di luar hal-hal dasar seperti daftar karakter (misalnya [abeq]) dan mungkin rentang karakter (misalnya [a-c]).

Perbedaan-perbedaan ini berarti kedua sistem hanya dapat dipertukarkan secara langsung untuk kasus-kasus sederhana. Jika Anda memerlukan pencocokan regex nama file, Anda harus melakukannya dengan cara lain. find -regexadalah salah satu pilihan. (Perhatikan bahwa ada juga find -name, yang menggunakan sintaks glob.)

Warren Young
sumber
2
Saya tidak tahu itu disebut globbing :)
user3539
3
Selain itu, ada berbagai rasa regex. Tidak semua regex dibuat sama! Dan Anda memiliki banyak sistem pencocokan pola lainnya, seperti SQL like , yang '%'artinya '*'.
Tn. Lister
4
Dua rasa utama regexp adalah POSIX dan PCRE (Perl Compatible RE). Yang kemudian kurang bertele-tele dan memiliki beberapa fitur lainnya. Alat dan shell Unix umumnya menggunakan POSIX, sebagian besar bahasa pemrograman dengan regexps bawaan (kecuali shell) menggunakan PCRE. Berhati-hatilah dengan perbedaannya saat Anda membaca materi online.
goldilocks
11

Menjawab pertanyaan yang diungkapkan dalam judul aslinya:

Mengapa persamaan reguler berbeda dari yang digunakan untuk memfilter file?

Ekspansi nama file mendahului ekspresi reguler, sudah ada dengan sebagian besar sistem operasi (karakter wildcard / joker) dan jauh lebih sederhana dan intuitif daripada yang terakhir.

Meskipun *.txtmudah dimengerti oleh pengguna biasa, analognya .*\.txtadalah sesuatu yang lebih ditargetkan untuk pengguna / programmer berpengalaman, belum lagi ^.*\.txt$...

Jlliagre
sumber
2
Alasan lain untuk bagian "mengapa": kecepatan. Ekspresi reguler lebih lambat: pastebin.com/3iNCgkE3
manatwork
3
*.txttidak sama .*\.txt, itu (kebanyakan) sama .*\.txt$karena tidak ada apa-apa setelah .txt(setidaknya dengan asumsi nama file globbing masuk akal ). Mungkin bahkan ^.*\.txt$agak tergantung penggunaan. Buktikan poin Anda?
CVn