Sementara kami menggunakan *
untuk menunjukkan nol atau lebih karakter sebelumnya di grep
, kami menggunakan *.c
untuk menemukan semua file C saat kita menggunakannya dengan ls
perintah seperti ls *.c
. Bisakah seseorang memberi tahu bagaimana penggunaan *
berbeda dalam dua kasus ini?
Jawaban yang Diterima:
Nama file shell globbing dan ekspresi reguler menggunakan beberapa karakter yang sama, dan mereka memiliki tujuan yang sama, tetapi Anda benar, mereka tidak kompatibel. Globbing nama file adalah sistem yang jauh lebih kuat.
Dalam globbing nama file:
-
*
berarti “nol atau lebih karakter” -
?
berarti “setiap karakter tunggal”
Tapi di regex, Anda harus menggunakan .*
berarti “nol atau lebih karakter”, dan .
berarti "setiap karakter tunggal." Sebuah ?
berarti sesuatu yang sangat berbeda dalam regex:nol atau satu instance dari elemen RE sebelumnya.
Tanda kurung siku ([]
) tampaknya berfungsi sama di kedua sistem pada sistem tempat saya mengetik ini, setidaknya untuk kasus sederhana. Ini mencakup hal-hal seperti kelas karakter POSIX (mis. [:alpha:]
). Karena itu, jika Anda memerlukan perintah untuk bekerja pada banyak jenis sistem yang berbeda, saya sarankan untuk tidak menggunakan apa pun di luar hal-hal dasar seperti daftar karakter (mis. [abeq]
) dan mungkin rentang karakter (mis. [a-c]
).
Perbedaan ini berarti kedua sistem hanya dapat dipertukarkan secara langsung untuk kasus-kasus sederhana. Jika Anda memerlukan pencocokan regex untuk nama file, Anda perlu melakukannya dengan cara lain. find -regex
adalah salah satu pilihan. (Perhatikan bahwa ada juga find -name
, omong-omong, yang menggunakan sintaks glob.)