Saya punya file alphanum
dengan dua baris ini:
123 abc
this is a line
Saya bingung mengapa, ketika saya menjalankan sed 's/[a-z]*/SUB/' alphanum
, saya mendapatkan output berikut:
SUB123 abc
SUB is a line
Saya mengharapkan:
123 SUB
SUB is a line
Saya menemukan perbaikan (gunakan sed 's/[a-z][a-z]*/SUB/'
saja), tapi saya tidak mengerti mengapa itu berhasil dan milik saya tidak.
Dapatkah kamu menolong?
sed
regular-expression
Fakher Mokadem
sumber
sumber
ls foo*
sana). Tapi bagaimanapun, jika Anda menemukan pertanyaan yang merupakan duplikat, saya pikir Anda harus dapat menandai mereka juga.Jawaban:
Pola
[a-z]*
cocok dengan nol atau lebih karakter dalam rentanga
kez
( karakter sebenarnya tergantung pada lokal saat ini). Ada nol karakter tersebut di awal string123 abc
(yaitu pola yang cocok), dan juga empat dari mereka di awalthis is a line
.Jika Anda membutuhkan setidaknya satu kecocokan, gunakan
[a-z][a-z]*
atau[a-z]\{1,\}
, atau aktifkan ekspresi reguler yang diperluas dengansed -E
dan gunakan[a-z]+
.Untuk memvisualisasikan di mana pola cocok, tambahkan tanda kurung di sekitar setiap pertandingan:
Atau, untuk melihat semua kecocokan pada baris:
Bandingkan hasil terakhir itu dengan
sumber
[a-z]
cocok dengan elemen penyusun yang dapat dibuat lebih dari satu karakter. Misalnya, di beberapa lokal Hongaria,[a-z]
pertandingan padadzs
Karena
*
cocok dengan nol atau lebih pengulangan dari atom sebelumnya, dan semua mesin regex mencoba menemukan kecocokan pertama. Ada substring persis nol huruf di awal string Anda, jadi di situlah cocok. Dalam kasus di mana string dimulai dengan huruf,*
kecocokan sebanyak mungkin, tetapi ini sekunder untuk menemukan kecocokan paling kiri.Pencocokan panjang nol dapat sedikit bermasalah, dan seperti yang Anda lihat, solusinya adalah mengubah pola sehingga membutuhkan setidaknya satu karakter. Dengan regex yang diperluas, Anda bisa
+
untuk itu:sed -E 's/[a-z]+/SUB/'
Untuk bersenang-senang, cobalah:
sumber