Mengapa `grep fil *` gagal?

9

Saya menemukan echo file|grep fil*gagal, tetapi echo abcd|grep abc*berhasil.

Saya tidak mengerti, bisakah seseorang menjelaskan?

tmpbin
sumber
Bisakah Anda menambahkan sistem dan versi grep? Ini karena dengan gnugrep 2.16 (di bawah Ubuntu 14.04 LTS), itu tidak menghasilkan kesalahan (kode keluar 0) dan cocok dengan tiga huruf pertama. Misalnya, echo file|grep fil*jawaban dengan file.
Hastur
3
@ Rushur Masalahnya disebabkan oleh ekspansi nama file sebelum ekspresi reguler. Direktori kerja saya berisi awalan file dengan fil, tetapi bukan file yang diawali oleh abc, jadi fil * diganti dengan nama file, tetapi abc * tidak berubah.
tmpbin
Terima kasih saya tidak memikirkannya. Ketika saya melakukan upaya saya, saya mencobanya di direktori baru ...
Hastur

Jawaban:

31

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 fdiikuti dengan idiikuti oleh nol atau lebih lkarakter. 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 grepakan 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.*'.

Warren Young
sumber