Stream Editor - Mengelola Pola
Kita telah membahas penggunaan pattern and hold buffer. Dalam bab ini, kita akan mempelajari lebih lanjut tentang penggunaannya. Mari kita bahasnperintah yang mencetak ruang pola. Ini akan digunakan bersama dengan perintah lain. Diberikan di bawah ini adalah sintaks dari perintah then.
[address1[,address2]]n
Mari kita ambil contoh.
[jerry]$ sed 'n' books.txt
Ketika kode diatas dijalankan maka akan menghasilkan hasil sebagai berikut:
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
Itu n perintah mencetak konten buffer pola, membersihkan buffer pola, mengambil baris berikutnya ke dalam buffer pola, dan menerapkan perintah di atasnya.
Mari kita pertimbangkan ada tiga perintah SED sebelumnya n dan dua perintah SED setelahnya n sebagai berikut:
Sed command #1
Sed command #2
Sed command #3
n command
Sed command #4
Sed command #5
Dalam kasus ini, SED menerapkan tiga perintah pertama pada buffer pola, membersihkan buffer pola, mengambil baris berikutnya ke dalam buffer pola, dan setelah itu menerapkan perintah keempat dan kelima di atasnya. Ini adalah konsep yang sangat penting. Jangan melanjutkan tanpa memiliki pemahaman yang jelas tentang ini.
Buffer penahan menampung data, tetapi perintah SED tidak dapat diterapkan secara langsung pada buffer penahan. Oleh karena itu, kita perlu membawa data buffer penahan ke dalam pola buffer. SED menyediakanxperintah untuk menukar isi pola dan menahan buffer. Perintah berikut menggambarkanx perintah.
Mari kita sedikit memodifikasi file books.txt. Misalnya, file tersebut berisi judul buku yang diikuti dengan nama penulisnya. Setelah diubah, file akan terlihat seperti ini:
[jerry]$ cat 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
Mari kita tukar isi dari kedua buffer tersebut. Misalnya, contoh berikut hanya mencetak nama penulis.
[jerry]$ sed -n 'x;n;p' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
George R. R. Martin
J. R. R. Tolkien
Paulo Coelho
J. R. R. Tolkien
Paulo Coelho
George R. R. Martin
Mari kita pahami cara kerja perintah ini.
Awalnya, SED membaca baris pertama, yaitu, A Storm of Swords ke dalam buffer pola.
x perintah memindahkan baris ini ke buffer penahan.
n mengambil baris berikutnya, yaitu George RR Martin ke dalam buffer pola.
Kontrol lolos ke perintah diikuti oleh n yang mencetak konten buffer pola.
Proses ini berulang hingga file habis.
Sekarang mari kita tukar isi buffer sebelum mencetak. Tebak, apa yang terjadi? Ya, itu mencetak judul buku.
[jerry]$ sed -n 'x;n;x;p' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
A Storm of Swords
The Two Towers
The Alchemist
The Fellowship of the Ring
The Pilgrimage
A Game of Thrones
Itu hperintah menangani buffer penahan. Ini menyalin data dari buffer pola ke buffer penahan. Data yang ada dari buffer penahanan akan ditimpa. Perhatikan bahwahPerintah tidak memindahkan data, hanya menyalin data. Oleh karena itu, data yang disalin tetap seperti di buffer pola. Diberikan di bawah ini adalah sintaks darih perintah.
[address1[,address2]]h
Perintah berikut hanya mencetak judul penulis Paulo Coelho.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
The Alchemist
The Pilgrimage
Mari kita pahami cara kerja perintah di atas. Isi books.txt mengikuti format tertentu. Baris pertama adalah judul buku diikuti oleh penulis buku. Pada perintah di atas, "!" digunakan untuk membalikkan kondisi, yaitu, garis disalin ke buffer penahan hanya jika pola yang cocok tidak berhasil. Dan tanda kurung kurawal {} digunakan untuk mengelompokkan beberapa perintah SED
Pada lintasan pertama perintah, SED membaca baris pertama, yaitu, A Storm of Swords ke dalam buffer pola dan memeriksa apakah itu berisi pola Paulo atau tidak. Karena pencocokan pola tidak berhasil, baris ini akan disalin ke buffer penahan. Sekarang baik buffer pola dan buffer penahan berisi baris yang sama yaitu, A Storm of Swords. Pada langkah kedua, ini memeriksa apakah garis tersebut berisi pola Paulo atau tidak. Karena polanya tidak cocok, ia tidak melakukan apa pun.
Pada lintasan kedua, ia membaca baris berikutnya George RR Martin ke dalam buffer pola dan menerapkan langkah yang sama. Untuk tiga baris berikutnya, ia melakukan hal yang sama. Di akhir operan kelima, kedua buffer berisi The Alchemist. Pada awal operan keenam, baris tersebut akan dibaca Paulo Coelho dan saat polanya cocok, baris ini tidak akan disalin ke dalam buffer penahan. Karenanya, buffer pola berisi Paulo Coelho, dan buffer penahan berisi The Alchemist.
Setelah itu, ia memeriksa apakah buffer pola berisi pola Paulo. Saat pencocokan pola berhasil, itu menukar konten buffer pola dengan buffer penahan. Sekarang buffer pola berisi The Alchemist dan buffer penahan berisi Paulo Coelho. Akhirnya, ini mencetak konten buffer pola. Langkah yang sama diterapkan pada pola The Pilgrimage.
Itu hperintah ini menghancurkan konten buffer penahanan sebelumnya. Ini tidak selalu dapat diterima, karena terkadang kita perlu melestarikan isinya. Untuk tujuan ini, SED menyediakan fileHperintah yang menambahkan konten ke buffer penahanan dengan menambahkan baris baru di akhir. Satu-satunya perbedaan antarah dan Hperintahnya adalah, yang pertama menimpa data dari buffer penahan, sedangkan yang kemudian menambahkan data ke buffer penahan. Sintaksnya mirip denganh perintah.
[address1[,address2]]H
Mari kita ambil contoh lain. Kali ini, alih-alih hanya mencetak judul buku, cetak juga nama pengarangnya. Contoh berikut mencetak judul buku diikuti dengan nama penulisnya.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
The Alchemist
Paulo Coelho
The Pilgrimage
Paulo Coelho
Kami belajar cara menyalin / menambahkan konten buffer pola untuk menahan buffer. Bisakah kita melakukan fungsi kebalikannya juga? Ya tentu! Untuk tujuan ini, SED menyediakan filegperintah yang menyalin data dari buffer penahan ke buffer pola. Saat menyalin, data yang ada dari ruang pola akan ditimpa. Diberikan di bawah ini adalah sintaksg perintah.
[address1[,address2]]g
Mari kita perhatikan contoh yang sama - mencetak judul buku dan penulisnya. Kali ini, pertama-tama kita akan mencetak nama pengarang dan baris berikutnya, judul buku yang sesuai. Perintah berikut mencetak nama penulis Paulo Coelho, diikuti dengan judul bukunya.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
Paulo Coelho
The Alchemist
Paulo Coelho
The Pilgrimage
Perintah pertama disimpan apa adanya. Di akhir operan kelima, kedua buffer berisi The Alchemist. Pada awal operan keenam, baris tersebut akan dibaca Paulo Coelho dan saat polanya cocok, baris ini tidak akan disalin ke dalam buffer penahan. Karenanya, ruang pola berisi Paulo Coelho dan ruang pegang berisi The Alchemist.
Setelah itu, ia memeriksa apakah ruang pola berisi pola Paulo. Saat pencocokan pola berhasil, pertama-tama akan mencetak konten ruang pola, yaitu Paulo Coelho, kemudian menyalin buffer penahan ke buffer pola. Karenanya, baik pola maupun buffer berisi The Alchemist. Akhirnya, ini mencetak konten buffer pola. Langkah yang sama diterapkan pada pola The Pilgrimage.
Demikian pula, kita dapat menambahkan konten buffer penahan ke buffer pola. SED menyediakanG perintah yang menambahkan konten ke buffer pola dengan menambahkan baris baru di akhir.
[address1[,address2]]G
Sekarang mari kita ambil contoh sebelumnya yang mencetak nama pengarang Paulo Coelhof diikuti dengan judul bukunya. Untuk mencapai hasil yang sama, jalankan perintah SED berikut.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
Paulo Coelho
The Alchemist
Paulo Coelho
The Pilgrimage
Dapatkah Anda memodifikasi contoh di atas untuk menampilkan judul buku yang diikuti oleh penulisnya? Sederhana, cukup tukar konten buffer sebelum fileG perintah.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt
Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:
The Alchemist
Paulo Coelho
The Pilgrimage
Paulo Coelho