grep lines dimulai dengan "1" di Ubuntu

47

Saya mencoba mencari baris yang dimulai dengan "1" menggunakan

ls -1 | grep ^1*

tetapi mengembalikan garis yang tidak dimulai dengan 1. Apa yang saya lewatkan di sini?

Tim
sumber
Hanya catatan lain: Jika Anda ingin menggunakan grep untuk membatasi lsoutput, Anda akan mengalami masalah jika nama file mengandung beberapa karakter aneh, seperti baris baru ... Banyak perintah lain (entah bagaimana tidak ls, setidaknya bukan versi yang harus saya periksa) memiliki opsi untuk memberikan output yang dipisahkan nol, yang kemudian dapat Anda proses dengan amangrep -z
Gert van den Berg
Terima kasih, @GertvandenBerg! Masalah apa yang dapat disebabkan oleh beberapa karakter aneh seperti baris baru? Perintah apa yang memberikan output terpisah nol?
Tim
1
temukan dengan -print0, sebagian besar alat GNU lainnya memiliki opsi -0 atau -z. (sort, xargs, dll juga). Jika nama file berisi baris baru, maka tidak mungkin untuk mengetahui apakah dua baris adalah nama file yang berisi baris baru atau dua nama file yang terpisah.
Gert van den Berg

Jawaban:

68

Ekspresi reguler Anda tidak berarti apa yang Anda pikirkan. Ini cocok dengan semua baris yang dimulai (^) dengan satu (1) diulang nol atau lebih (*) kali. Semua string cocok dengan ekspresi reguler itu. grep '^1'lakukan apa yang kamu inginkan.

otokan
sumber
33

Apakah Anda mencoba yang berikut ini?

 ls -1 | grep "^1"

Yaitu, hapus *, yang pada dasarnya memberitahu grep, temukan nol atau lebih dari ^1ekspresi. Dengan kata lain: cocokkan dengan garis yang dimulai dengan 1, atau tidak.

Bernhard
sumber
13

Meskipun ini tidak menjawab pertanyaan Anda, ini adalah solusi yang lebih baik untuk apa yang tampaknya menjadi tujuan Anda:

ls -ld 1*

Anda dapat menggunakan shell glob untuk mendaftar semua file yang dimulai dengan 1. Catatan yang *memiliki arti berbeda dalam shell globbing dari ekspresi reguler.

jordanm
sumber
Terima kasih! +1. Bagaimana * memiliki arti berbeda dalam shell globbing dan dalam ekspresi reguler?
Tim
2
Dalam sebuah shell glob * adalah wildcard yang berarti "0 atau lebih dari karakter apa pun ". Makna regex dijelaskan dalam jawaban otokan.
jordanm
3

^ 1. * cocok dengan seluruh baris, atau seperti yang disebutkan di atas, ^ 1 mendapat string yang terkandung di dalam baris.

gaya regex yang berbeda menggunakan simbol berbeda yang mewakili karakter, beberapa opsi menentukan gaya mana yang Anda inginkan. dan berbagai opsi menentukan apakah Anda ingin mencocokkan seluruh baris, atau hanya sebagian saja, atau seluruh input sebagai satu string.

Shellukolle
sumber