Editor Streaming - Loop
Seperti bahasa pemrograman lainnya, SED juga menyediakan fasilitas perulangan dan percabangan untuk mengontrol aliran eksekusi. Dalam bab ini, kita akan mempelajari lebih lanjut tentang cara menggunakan loop dan cabang di SED.
Sebuah loop di SED bekerja mirip dengan a gotopernyataan. SED dapat melompat ke baris yang ditandai oleh label dan melanjutkan menjalankan perintah yang tersisa. Di SED, kita dapat mendefinisikan alabel sebagai berikut:
:label
:start
:end
:up
Dalam contoh di atas, nama setelah titik dua (:) menyiratkan nama label.
Untuk melompat ke label tertentu, kita dapat menggunakan bperintah diikuti dengan nama label. Jika nama label dihilangkan, maka SED melompat ke akhir file SED.
Mari kita tulis skrip SED sederhana untuk memahami loop dan cabang. Di file books.txt kami, ada beberapa entri judul buku dan pengarangnya. Contoh berikut menggabungkan judul buku dan nama pengarangnya dalam satu baris yang dipisahkan oleh koma. Kemudian mencari pola "Paulo". Jika polanya cocok, ia akan mencetak tanda hubung (-) di depan baris, jika tidak maka akan melompat kePrint label yang mencetak garis.
[jerry]$ sed -n '
h;n;H;x
s/\n/, /
/Paulo/!b Print
s/^/- /
:Print
p' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
- The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
- The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
Sekilas, skrip di atas mungkin terlihat samar. Mari kita jelaskan ini.
Dua perintah pertama sudah cukup jelas h;n;H;x dan s/\n/, / gabungkan judul buku dan pengarangnya dipisahkan dengan koma (,).
Perintah ketiga melompat ke label Print hanya jika polanya tidak cocok, jika tidak substitusi dilakukan oleh perintah keempat.
:Print hanyalah nama label dan seperti yang sudah Anda ketahui, p adalah perintah cetak.
Untuk meningkatkan keterbacaan, setiap perintah SED ditempatkan pada baris terpisah. Namun, seseorang dapat memilih untuk menempatkan semua perintah dalam satu baris sebagai berikut:
[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
- The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
- The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin