Ringkasan
Sintaks GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
Atau genap (hanya menggunakan satu kali kata yang akan diganti:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
Atau, dalam sintaks POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
bekerja pada sed apa saja, proses hanya sebanyak garis yang diperlukan untuk menemukan yang pertama claudio
, bekerja bahkan jika claudio
berada di baris pertama dan lebih pendek karena hanya menggunakan satu string regex.
Detail
Untuk mengubah hanya satu baris, Anda hanya perlu memilih satu baris.
Menggunakan 1,/claudio/
(dari pertanyaan Anda) memilih:
- dari baris pertama (tanpa syarat)
- ke baris berikutnya yang berisi string
claudio
.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Untuk memilih setiap baris yang berisi claudio
, gunakan:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
Dan untuk memilih hanya yang pertama claudio
dalam file, gunakan:
sed -n '/claudio/{p;q}' file
claudio 1
Kemudian, Anda hanya dapat melakukan substitusi pada baris itu:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
Yang hanya akan mengubah kemunculan pertama pertandingan regex di telepon, meskipun mungkin ada lebih dari satu, di baris pertama yang cocok dengan regex.
Tentu saja, /claudio/
regex dapat disederhanakan untuk:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
Dan, kemudian, satu-satunya hal yang hilang adalah mencetak semua baris lain yang tidak dimodifikasi:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: Sejumlah baris 0 dapat digunakan dalam spesifikasi alamat seperti0,/REGEXP/
sehinggased
akan mencoba mencocokkan REGEXP pada baris input pertama juga. Dengan kata lain,0,/REGEXP/
adalah mirip dengan1,/REGEXP/
, kecuali bahwa jika ADDR2 cocok dengan baris pertama input 0, / REGEXP / form akan menganggapnya untuk mengakhiri rentang, sedangkan bentuk 1, / REGEXP / akan cocok dengan awal rentangnya dan karenanya membuat rentang rentang hingga kemunculan kedua dari ekspresi reguler)