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.*'.
echo file|grep fil*
jawaban denganfil
e.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", jadifil*
berartif
diikuti dengani
diikuti oleh nol atau lebihl
karakter. Anda perlu mengatakangrep 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*
atauabc*
, shell akan memperluasnya , sehinggagrep
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.*'
.sumber