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