Jawaban:
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 -regex
adalah salah satu pilihan. (Perhatikan bahwa ada juga find -name
, yang menggunakan sintaks glob.)
'%'
artinya '*'
.
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 *.txt
mudah dimengerti oleh pengguna biasa, analognya .*\.txt
adalah sesuatu yang lebih ditargetkan untuk pengguna / programmer berpengalaman, belum lagi ^.*\.txt$
...
*.txt
tidak 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?