Saya menemukan echo file|grep fil*
gagal, tetapi echo abcd|grep abc*
berhasil.
Saya tidak mengerti, bisakah seseorang menjelaskan?
Saya menemukan echo file|grep fil*
gagal, tetapi echo abcd|grep abc*
berhasil.
Saya tidak mengerti, bisakah seseorang menjelaskan?
Jawaban:
Ada dua masalah dengan contoh Anda.
Yang utama adalah bahwa Anda mengasumsikan bahwa ekspresi reguler bekerja sama dengan pola glob di dalamnya*
adalah wildcard yang berarti "urutan karakter apa pun." Dalam ekspresi reguler, *
berarti "sejumlah atom sebelumnya", jadi fil*
berarti f
diikuti dengan i
diikuti oleh nol atau lebih l
karakter. Anda perlu mengatakan grep fil.*
untuk mendapatkan makna yang dimaksud: .
berarti "karakter apa saja, jadi itu .*
berarti" urutan karakter apa pun. "
Masalah yang lebih kecil adalah bahwa Anda menggunakan karakter khusus yang tidak dikutip yang berarti sesuatu di bawah aturan glob, yang berarti shell dapat menafsirkannya. Jika Anda memiliki file di direktori lokal yang cocok dengan pola glob fil*
atau abc*
, shell akan memperluasnya , sehingga grep
akan mendapatkan nama file yang diperluas sebagai sebuah pola, bukan RE yang dimaksud. Setiap kali Anda menggunakan karakter seperti pada baris perintah, Anda harus mengutip mereka: echo file | grep 'fil.*'
.
echo file|grep fil*
jawaban denganfil
e.