Artikel ini adalah bagian dari seri Tips dan Trik Unix Sed yang sedang berlangsung.
Dalam artikel sed kami sebelumnya, kami telah mempelajari — pencetakan sed, penghapusan sed, penggantian sed , penulisan file sed, beberapa perintah sed, operasi multi-baris sed, dan manipulasi baris file sed.
Di bagian pertama tutorial sed, kami mempelajari bahwa sed memiliki dua buffer — sed pattern buffer dan sed menahan buffer . Sejauh ini kita hanya berbicara tentang buffer pola.
Dalam artikel ini mari kita tinjau cara menggunakan sed hold dan pattern buffer menggunakan 7 contoh sed praktis .
Sesuai dengan namanya, sed hold buffer digunakan untuk menyimpan semua atau sebagian dari ruang pola sed untuk pengambilan selanjutnya. Isi ruang pola dapat disalin ke ruang penahan, lalu kembali lagi. Tidak ada operasi yang dilakukan secara langsung di ruang tunggu. sed menyediakan satu set fungsi hold dan get untuk menangani gerakan ini.
Fungsi sed h
Fungsi h (hold) menyalin konten ruang pola ke dalam area holding (juga disebut sebagai sed hold space ), menghancurkan konten sebelumnya dari area penyimpanan.
Fungsi Sed H
Fungsi H menambahkan konten ruang pola ke konten area penahan. Konten lama dan konten baru dipisahkan oleh baris baru.
Fungsi sed g
Fungsi g menyalin konten area penahan ke dalam ruang pola, menghancurkan konten ruang pola sebelumnya.
Fungsi Sed G
Fungsi G menambahkan konten area penahan ke konten ruang pola. Isi lama dan baru dipisahkan oleh baris baru. Jumlah maksimum alamat adalah dua.
Fungsi Sed x
Fungsi pertukaran menukar isi ruang pola dan area penahan. Jumlah maksimum alamat adalah dua.
Sekarang mari kita lihat beberapa contoh untuk mempelajari perintah di atas.
Mari kita buat file geekstuff.txt terlebih dahulu yang akan digunakan dalam contoh yang disebutkan di bawah ini.
$ cat thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures
1. Beri Spasi Ganda pada Konten File Menggunakan Perintah Sed
$sed 'G' thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures $
Dalam contoh ini,
- Sed membaca sebuah baris dan menempatkannya di buffer pola.
- Perintah G menambahkan buffer penahan ke buffer pola yang dipisahkan oleh \n. jadi satu baris baru akan ditambahkan dengan konten ruang pola.
- Demikian pula, Jika Anda ingin melipatgandakan ruang file, tambahkan konten buffer tahan ke buffer pola dua kali. (G;G)
2. Cetak Konten File dalam Urutan Terbalik Menggunakan Perintah Sed
Cetak baris file dalam urutan terbalik (mirip dengan perintah tac yang telah kita bahas sebelumnya).
$sed -n '1!G;h;$p' thegeekstuff.txt Procedures Queries Oracle Mysql #Database Administration #Windows Tips and Tricks Scripting Administration #Linux
Dalam contoh ini,
- Baris pertama akan ditempatkan di ruang tunggu sebagaimana adanya.
- Dari baris ke-2 dan seterusnya, cukup tambahkan konten ruang tahan dengan ruang pola. (Ingat baris ke-2 di ruang pola, dan baris ke-1 di ruang tunggu).
- Sekarang baris ke-1 dan ke-2 dibalik dan pindahkan ini ke ruang tunggu.
- Ulangi langkah di atas sampai baris terakhir.
- Setelah baris terakhir tercapai, cukup tambahkan konten ruang tahan dengan ruang pola dan cetak ruang pola.
3. Cetak Paragraf (Hanya jika berisi pola yang diberikan) Menggunakan Perintah Sed
Dalam paragraf cetak thegeekstuff.txt hanya jika berisi pola "Administrasi".
$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration
Dalam contoh ini,
- Sampai baris kosong datang, terus tambahkan baris yang tidak kosong ke dalam ruang tunggu
- Ketika baris kosong datang yaitu paragraf berakhir, tukar data antara pola dan ruang tahan. Sehingga seluruh paragraf akan tersedia dalam ruang pola.
Periksa apakah pola “Administrasi” tersedia, jika ya jangan hapus yaitu cetak ruang pola
4. Cetak garis tepat sebelum kecocokan pola menggunakan Perintah Sed
Cetak hanya baris sebelumnya, pola "Mysql".
$ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt #Database
Dalam contoh ini,
- Untuk setiap siklus, masukkan baris ke dalam hold buffer, jika tidak sesuai dengan pola “Mysql”.
- Jika garis cocok dengan pola, ambil data dari ruang tunggu (baris sebelumnya) menggunakan perintah g dan cetak.
- Jika baris pertama cocok dengan pola “Mysql”, maka spasi akan kosong.(Tidak ada baris sebelumnya ke baris pertama). Jadi baris pertama tidak boleh dicetak(1!p)
5. Hapus baris terakhir setiap paragraf menggunakan Perintah Sed
$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt #Linux Administration Scripting #Windows #Database Mysql Oracle Queries
Dalam contoh ini,
- Jika garis tidak kosong, maka tukar garis antara pola dan ruang tahan. Jadi baris pertama akan ditempatkan di ruang tunggu.
- Saat baris tidak kosong berikutnya muncul, tukar ruang pola dan ruang tahan, dan cetak ruang pola. yaitu baris pertama yang tidak kosong akan dicetak dan baris kedua akan ditahan. Dan pada siklus berikutnya, baris ke-2 yang tidak kosong dicetak saat baris ke-3 ditahan dan seterusnya seperti ini.
- Ketika baris kosong datang (baris sebelumnya ke baris kosong akan tersedia di buffer tahan) cukup tukar pola dan tahan spasi, dan hapus baris (baris terakhir paragraf) dan mulai siklus berikutnya.
6. Untuk setiap baris, tambahkan baris sebelumnya ke akhir menggunakan Perintah Sed
$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt #Linux Administration#Linux Scripting Administration Tips and Tricks Scripting Tips and Tricks #Windows Administration#Windows Administration #Database Mysql#Database Oracle Mysql Queries Oracle Procedures Queries
Dalam contoh ini,
- Tempatkan baris pertama di Hold buffer.
- Saat baris kedua muncul, tambahkan ke Tahan spasi (baris pertama)
- Kemudian tukar pola dan tahan buffer. Jadi sekarang ruang pola akan memiliki baris pertama dan kedua yang dipisahkan oleh \n, Ruang penahan hanya akan memiliki baris kedua.
- Jadi, tukarkan garis di ruang pola.
- Langkah-langkah di atas terjadi hingga akhir file
7. Tambahkan tag setiap blok ke setiap baris blok itu
$ sed ' /^#/{ h d } G s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt Linux Administration Linux Scripting Linux Tips and Tricks Linux Windows Administration Windows Database Mysql Database Oracle Database Queries Database Procedures
Dalam contoh ini,
- Ketika baris pertama dari sebuah blok terpenuhi (diawali dengan #)
- simpan baris itu ke Hold Space melalui perintah `h'
- Kemudian hapus menggunakan 'd' untuk memulai siklus lain.
- Untuk sisa baris blok, Command `G' menambahkan tag line dari Hold Space dan perintah pengganti menggantikan tag dan baris dengan benar.