Sed tingkat lanjut: Mengelola Aliran Teks di Linux. Menggunakan Linux sed Streaming Text Editor Perintah sed lainnya

Terakhir kali kita berbicara tentang fungsi dalam skrip bash, khususnya cara memanggilnya dari baris perintah. Topik kita hari ini adalah alat yang sangat berguna untuk memproses data string - utilitas Linux bernama sed. Ini sering digunakan untuk bekerja dengan teks yang terlihat seperti file log, file konfigurasi, dan file lainnya.



Jika Anda menangani data dengan cara tertentu dalam skrip bash, Anda harus terbiasa dengan alat sed dan gawk. Di sini kita akan fokus pada sed dan bekerja dengan teks, karena ini adalah langkah yang sangat penting dalam perjalanan kita melalui pengembangan skrip bash yang luas.

Sekarang kita akan menganalisis dasar-dasar bekerja dengan sed, serta melihat lebih dari tiga lusin contoh penggunaan alat ini.

dasar-dasar sed

Utilitas sed disebut editor teks aliran. Editor teks interaktif seperti nano bekerja dengan teks menggunakan keyboard, mengedit file, menambah, menghapus, atau mengubah teks. Sed memungkinkan Anda mengedit aliran data berdasarkan seperangkat aturan yang ditentukan oleh pengembang. Berikut skema pemanggilan perintah ini:

$ sed berkas opsi
Secara default, sed menerapkan aturan yang ditentukan saat dipanggil, dinyatakan sebagai sekumpulan perintah, ke STDIN . Ini memungkinkan data diteruskan langsung ke sed.

Misalnya seperti ini:

$ echo "Ini adalah ujian" | sed "s/tes/tes lain/"
Inilah yang terjadi ketika Anda menjalankan perintah ini.


Contoh panggilan sed sederhana

Dalam hal ini, sed mengganti kata "test" dalam string yang diteruskan untuk diproses dengan kata "test lain". Garis miring lurus digunakan untuk memformat aturan pemrosesan teks yang diapit tanda kutip. Dalam kasus kami, perintah seperti s/pattern1/pattern2/ digunakan. Huruf "s" merupakan singkatan dari kata "pengganti", artinya kita mempunyai tim pengganti. Sed, dengan menjalankan perintah ini, akan melihat teks yang ditransfer dan mengganti fragmen yang ditemukan di dalamnya (kita akan membicarakan yang mana, kita akan membicarakannya di bawah), sesuai dengan pattern1 , dengan pattern2 .

Di atas adalah contoh primitif penggunaan sed, hanya untuk membantu Anda memulai. Faktanya, sed dapat digunakan dalam skenario pemrosesan kata yang jauh lebih kompleks, seperti bekerja dengan file.

Di bawah ini adalah file yang berisi potongan teks, dan hasil pengolahannya dengan perintah ini:

$ sed "s/test/tes lain" ./filesaya


File teks dan hasil pengolahannya

Di sini pendekatan yang sama seperti yang kami gunakan di atas diterapkan, tetapi sekarang sed memproses teks yang disimpan dalam file. Namun, jika file tersebut cukup besar, Anda akan melihat bahwa sed memproses data dalam beberapa bagian dan menampilkan apa yang diproses di layar, tanpa menunggu seluruh file diproses.

Sed tidak mengubah data dalam file yang sedang diproses. Editor membaca file, memproses apa yang dibacanya, dan mengirimkan hasilnya ke STDOUT . Untuk memastikan bahwa file sumber tidak berubah, setelah diteruskan ke sed, cukup membukanya. Jika perlu, output dari sed dapat dialihkan ke file, mungkin menimpa file lama. Jika Anda familiar dengan salah satu panduan sebelumnya dalam seri ini, yang berhubungan dengan pengalihan aliran input dan output, Anda seharusnya bisa melakukan ini.

Menjalankan set perintah saat memanggil sed

Untuk melakukan beberapa operasi pada data, gunakan opsi -e saat memanggil sed. Misalnya, berikut cara mengatur penggantian dua bagian teks:

$ sed -e "s/Ini/Itu/; s/tes/tes lain/" ./file saya


Menggunakan tombol -e saat memanggil sed

Kedua perintah tersebut diterapkan ke setiap baris teks dari file. Mereka harus dipisahkan dengan titik koma, dan tidak boleh ada spasi antara akhir perintah dan titik koma.
Untuk memasukkan beberapa pola pemrosesan teks saat memanggil sed, Anda dapat, setelah memasukkan kutipan tunggal pertama, tekan Enter, lalu masukkan setiap aturan pada baris baru, jangan lupa kutipan penutup:

$ sed -e "> s/Ini/Itu/ > s/tes/tes lain/" ./file saya
Inilah yang terjadi setelah perintah yang disajikan dalam formulir ini dijalankan.


Cara lain untuk bekerja dengan sed

Membaca perintah dari file

Jika ada banyak perintah sed untuk memproses teks, biasanya yang terbaik adalah menuliskannya ke file terlebih dahulu. Untuk memberi tahu sed file yang berisi perintah, gunakan tombol -f:

Berikut isi file perintah saya:

S/Ini/Itu/ s/tes/tes lain/
Mari kita panggil sed, meneruskan ke editor sebuah file dengan perintah dan file untuk diproses:

$ sed -f perintah saya file saya
Hasil pemanggilan perintah seperti itu serupa dengan yang diperoleh pada contoh sebelumnya.


Menggunakan file dengan perintah saat memanggil sed

Ganti bendera perintah

Perhatikan baik-baik contoh berikut.

$ sed "s/test/tes lain/" file saya
Inilah yang ada di dalam file tersebut, dan apa yang akan dihasilkan saat sed memprosesnya.


File sumber dan hasil pengolahannya

Perintah ganti biasanya memproses file yang terdiri dari beberapa baris, tetapi hanya kemunculan pertama dari teks yang dicari pada setiap baris yang diganti. Untuk mengganti semua kemunculan suatu pola, flag yang sesuai harus digunakan.

Sintaks untuk menulis perintah pengganti saat menggunakan flag terlihat seperti ini:

S/pola/penggantian/bendera
Eksekusi perintah ini dapat dimodifikasi dengan beberapa cara.

  • Saat meneruskan nomor tersebut, nomor urut kemunculan pola dalam string diperhitungkan; kemunculan ini akan diganti.
  • Bendera g menunjukkan bahwa semua kemunculan pola dalam string harus diproses.
  • Bendera p menunjukkan bahwa isi string asli harus berupa keluaran.
  • Flag file w memberitahukan perintah untuk menulis hasil pemrosesan teks ke sebuah file.
Pertimbangkan penggunaan varian pertama dari perintah replace, yang menunjukkan posisi kemunculan fragmen yang diinginkan:

$ sed "s/test/tes lain/2" file saya

Memanggil perintah ganti yang menentukan posisi fragmen yang akan diganti

Di sini kami menetapkan, sebagai bendera pengganti, nomor 2. Hal ini menyebabkan fakta bahwa hanya kemunculan kedua dari pola yang diinginkan di setiap baris yang diganti. Sekarang mari kita coba flag pengganti global - g:

$ sed "s/test/tes lain/g" file saya
Seperti yang Anda lihat dari output, perintah ini menggantikan semua kemunculan pola dalam teks.


Penggantian Global

Flag perintah substitusi p memungkinkan keluaran baris yang cocok, sedangkan opsi -n yang ditentukan saat memanggil sed menekan keluaran normal:

$ sed -n "s/test/tes lain/p" file saya
Akibatnya, ketika sed dijalankan dalam konfigurasi ini, hanya baris (dalam kasus kami, satu baris) di mana potongan teks tertentu ditemukan yang ditampilkan di layar.


Menggunakan bendera perintah substitusi p

Mari kita gunakan flag w, yang memungkinkan Anda menyimpan hasil pemrosesan teks ke file:

$ sed "s/test/tes lain/w keluaran" file saya


Menyimpan hasil pemrosesan teks ke file

Terlihat jelas bahwa selama pengoperasian perintah, data dikeluarkan ke , sedangkan baris yang diproses ditulis ke file yang namanya ditentukan setelah w .

Karakter pembatas

Bayangkan mengganti /bin/bash dengan /bin/csh di /etc/passwd . Tugasnya tidak terlalu sulit:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Namun, kelihatannya tidak terlalu bagus. Masalahnya adalah karena garis miring digunakan sebagai karakter pemisah, karakter yang sama di baris yang diteruskan ke sed harus di-escape. Akibatnya, keterbacaan perintah menjadi terganggu.

Untungnya, sed memungkinkan kita mengatur sendiri karakter pembatas untuk digunakan dalam perintah pengganti. Pembatas adalah karakter pertama yang muncul setelah s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Dalam hal ini, tanda seru digunakan sebagai pembatas, membuat kode lebih mudah dibaca dan lebih bersih dari sebelumnya.

Memilih fragmen teks untuk diproses

Sejauh ini, kami telah memanggil sed untuk memproses semua yang diteruskan ke editor. Dalam beberapa kasus, hanya sebagian teks yang perlu diproses dengan sed - beberapa baris atau kelompok baris tertentu. Ada dua pendekatan untuk mencapai tujuan ini:
  • Tetapkan batas jumlah baris yang diproses.
  • Tentukan filter yang cocok dengan baris yang ingin Anda proses.
Mari kita pertimbangkan pendekatan pertama. Ada dua opsi yang memungkinkan di sini. Yang pertama, dibahas di bawah, mengatur jumlah satu baris yang akan diproses:

$ sed "2s/tes/tes lain/" file saya


Hanya memproses satu baris, nomor yang diberikan saat memanggil sed

Opsi kedua adalah serangkaian string:

$ sed "2,3s/tes/tes lain/" file saya


Penanganan Rentang Baris

Selain itu, Anda dapat memanggil perintah ganti agar file diproses dari baris tertentu hingga akhir:

$ sed "2,$s/tes/tes lain/" file saya


Memproses file dari baris kedua hingga akhir

Untuk memproses hanya baris yang cocok dengan filter yang ditentukan menggunakan perintah ganti, perintah harus dipanggil seperti ini:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Dengan analogi dengan apa yang telah dibahas di atas, templat dilewatkan sebelum nama perintah s .


Memproses Baris yang Cocok dengan Filter

Di sini kami menggunakan filter yang sangat sederhana. Untuk mengungkap sepenuhnya kemungkinan pendekatan ini, Anda dapat menggunakan ekspresi reguler. Kami akan membicarakannya di salah satu artikel berikut dalam seri ini.

Menghapus baris

Utilitas sed berguna untuk lebih dari sekedar mengganti urutan karakter dalam string dengan yang lain. Dengan bantuannya, yaitu menggunakan perintah d, Anda dapat menghapus baris dari aliran teks.

Panggilan perintah terlihat seperti ini:

$ sed "3d" file saya
Kami ingin baris ketiga dihapus dari teks. Perhatikan bahwa ini bukan file. File tidak akan berubah, penghapusan hanya akan mempengaruhi output yang dihasilkan oleh sed.


Menghapus baris ketiga

Jika Anda tidak menentukan nomor baris yang akan dihapus saat memanggil perintah d, semua baris di aliran akan dihapus.

Berikut cara menerapkan perintah d ke serangkaian baris:

$ sed "2,3d" file saya


Menghapus Rentang Baris

Dan berikut cara menghapus baris, mulai dari baris tertentu - hingga akhir file:

$ sed "3,$d" file saya


Hapus baris ke akhir file

Baris juga dapat dihapus sesuai pola:

$ sed "/test/d" file saya


Menghapus string berdasarkan pola

Saat memanggil d, Anda dapat menentukan beberapa pola - garis di mana pola tersebut muncul, dan garis di antara pola tersebut, akan dihapus:

$ sed "/detik/,/keempat/d" file saya


Menghapus Rentang Baris Menggunakan Pola

Memasukkan teks ke dalam aliran

Dengan sed, Anda dapat memasukkan data ke dalam aliran teks menggunakan perintah i dan a:
  • Perintah i menambahkan baris baru sebelum baris yang diberikan.
  • Perintah a menambahkan baris baru setelah baris yang diberikan.
Perhatikan contoh penggunaan perintah i:

$ echo "Tes lagi" | sed "i\Tes pertama"


Tim i

Sekarang mari kita lihat perintah a:

$ echo "Tes lagi" | sed "a\Tes pertama"


Tim a

Seperti yang Anda lihat, perintah ini menambahkan teks sebelum atau sesudah data dari aliran. Bagaimana jika Anda perlu menambahkan garis di tengah-tengah?

Disini kita akan terbantu dengan menentukan nomor garis referensi pada stream, atau template. Perhatikan bahwa menangani string sebagai rentang tidak akan berfungsi di sini. Mari kita panggil perintah i, tentukan nomor baris sebelum kita ingin menyisipkan baris baru:

$ sed "2i\Ini adalah baris yang disisipkan." file saya


saya perintahkan dengan nomor baris referensi

Mari kita lakukan hal yang sama dengan perintah a:

$ sed "2a\Ini adalah baris yang ditambahkan." file saya


Perintah a dengan nomor baris referensi

Perhatikan perbedaan cara kerja perintah i dan a. Yang pertama menyisipkan baris baru sebelum baris yang ditentukan, yang kedua - setelahnya.

Penggantian tali

Perintah c memungkinkan Anda mengubah konten seluruh baris teks dalam aliran data. Saat memanggilnya, Anda perlu menentukan nomor baris, alih-alih data baru mana yang harus ditambahkan ke aliran:

$ sed "3c\Ini adalah baris yang dimodifikasi." file saya


Mengganti seluruh string

Jika Anda menggunakan pola dalam bentuk teks biasa atau ekspresi reguler saat memanggil perintah, semua baris yang cocok dengan pola tersebut akan diganti:

$ sed "/Ini/c Ini adalah baris teks yang diubah." file saya


Mengganti string dengan pola

Substitusi karakter

Perintah y beroperasi pada karakter individual, menggantinya sesuai dengan data yang diteruskan ke karakter tersebut saat dipanggil:

$sed "y/123/567/"file saya


Substitusi karakter

Saat menggunakan perintah ini, Anda perlu memperhitungkan bahwa ini berlaku untuk seluruh aliran teks, Anda tidak dapat membatasinya pada kemunculan karakter tertentu.

Menampilkan nomor baris

Jika Anda memanggil sed menggunakan perintah =, utilitas akan mencetak nomor baris dalam aliran data:

$sed "="file saya


Menampilkan nomor baris

Editor aliran mengeluarkan nomor baris sebelum isinya.

Jika Anda meneruskan pola ke perintah ini dan menggunakan opsi sed -n, hanya nomor baris yang cocok dengan pola tersebut yang akan dicetak:

$ sed -n "/test/=" file saya


Menampilkan nomor baris yang cocok dengan suatu pola

Membaca data yang akan disisipkan dari suatu file

Di atas, kita melihat teknik untuk memasukkan data ke dalam aliran, menunjukkan apa yang harus dimasukkan, tepat saat memanggil sed. Anda juga dapat menggunakan file sebagai sumber data. Untuk melakukan ini, gunakan perintah r, yang memungkinkan Anda memasukkan data dari file tertentu ke dalam aliran. Saat memanggilnya, Anda dapat menentukan nomor baris yang ingin Anda masukkan konten file, atau templatnya.

Perhatikan sebuah contoh:

$ sed "3r file baru" file saya


Memasukkan Konten File ke dalam Aliran

Di sini konten newfile telah disisipkan setelah baris ketiga myfile .

Inilah yang terjadi jika Anda menggunakan templat saat memanggil perintah r:

$ sed "/test/r file baru" file saya


Menggunakan wildcard saat menjalankan perintah r

Isi file akan disisipkan setelah setiap baris yang cocok dengan polanya.

Contoh

Mari kita bayangkan tugas seperti itu. Ada sebuah file yang didalamnya terdapat rangkaian karakter tertentu, tidak ada artinya sendiri, yang harus diganti dengan data yang diambil dari file lain. Yaitu, biarlah itu menjadi file newfile , di mana urutan karakter DATA berperan sebagai placeholder. Data yang akan diganti DATA disimpan dalam file data.

Anda dapat mengatasi masalah ini menggunakan perintah r dan d dari editor sed stream:

$ Sed "/DATA>/ ( r file baru d)" file saya


Mengganti placeholder dengan data nyata

Seperti yang Anda lihat, alih-alih placeholder DATA, sed menambahkan dua baris dari file data ke aliran keluaran.

Hasil

Hari ini kita membahas dasar-dasar bekerja dengan editor sed stream. Faktanya, sed adalah topik yang sangat besar. Mempelajarinya dapat dibandingkan dengan mempelajari bahasa pemrograman baru, tetapi setelah Anda memahami dasar-dasarnya, Anda dapat menguasai sed ke tingkat mana pun yang Anda perlukan. Akibatnya, kemampuan Anda mengolah teks dengannya hanya akan dibatasi oleh imajinasi Anda.

Itu saja untuk hari ini. Lain kali kita akan berbicara tentang bahasa pemrosesan data awk.

Pembaca yang budiman! Apakah Anda menggunakan sed dalam pekerjaan sehari-hari Anda? Jika ya, silakan bagikan pengalaman Anda.

Terakhir kali kita berbicara tentang fungsi dalam skrip bash, khususnya cara memanggilnya dari baris perintah. Topik kita hari ini adalah alat yang sangat berguna untuk memproses data string - utilitas Linux bernama sed. Ini sering digunakan untuk bekerja dengan teks yang terlihat seperti file log, file konfigurasi, dan file lainnya.



Jika Anda menangani data dengan cara tertentu dalam skrip bash, Anda harus terbiasa dengan alat sed dan gawk. Di sini kita akan fokus pada sed dan bekerja dengan teks, karena ini adalah langkah yang sangat penting dalam perjalanan kita melalui pengembangan skrip bash yang luas.

Sekarang kita akan menganalisis dasar-dasar bekerja dengan sed, serta melihat lebih dari tiga lusin contoh penggunaan alat ini.

dasar-dasar sed

Utilitas sed disebut editor teks aliran. Editor teks interaktif seperti nano bekerja dengan teks menggunakan keyboard, mengedit file, menambah, menghapus, atau mengubah teks. Sed memungkinkan Anda mengedit aliran data berdasarkan seperangkat aturan yang ditentukan oleh pengembang. Berikut skema pemanggilan perintah ini:

$ sed berkas opsi
Secara default, sed menerapkan aturan yang ditentukan saat dipanggil, dinyatakan sebagai sekumpulan perintah, ke STDIN . Ini memungkinkan data diteruskan langsung ke sed.

Misalnya seperti ini:

$ echo "Ini adalah ujian" | sed "s/tes/tes lain/"
Inilah yang terjadi ketika Anda menjalankan perintah ini.


Contoh panggilan sed sederhana

Dalam hal ini, sed mengganti kata "test" dalam string yang diteruskan untuk diproses dengan kata "test lain". Garis miring lurus digunakan untuk memformat aturan pemrosesan teks yang diapit tanda kutip. Dalam kasus kami, perintah seperti s/pattern1/pattern2/ digunakan. Huruf "s" merupakan singkatan dari kata "pengganti", artinya kita mempunyai tim pengganti. Sed, dengan menjalankan perintah ini, akan melihat teks yang ditransfer dan mengganti fragmen yang ditemukan di dalamnya (kita akan membicarakan yang mana, kita akan membicarakannya di bawah), sesuai dengan pattern1 , dengan pattern2 .

Di atas adalah contoh primitif penggunaan sed, hanya untuk membantu Anda memulai. Faktanya, sed dapat digunakan dalam skenario pemrosesan kata yang jauh lebih kompleks, seperti bekerja dengan file.

Di bawah ini adalah file yang berisi potongan teks, dan hasil pengolahannya dengan perintah ini:

$ sed "s/test/tes lain" ./filesaya


File teks dan hasil pengolahannya

Di sini pendekatan yang sama seperti yang kami gunakan di atas diterapkan, tetapi sekarang sed memproses teks yang disimpan dalam file. Namun, jika file tersebut cukup besar, Anda akan melihat bahwa sed memproses data dalam beberapa bagian dan menampilkan apa yang diproses di layar, tanpa menunggu seluruh file diproses.

Sed tidak mengubah data dalam file yang sedang diproses. Editor membaca file, memproses apa yang dibacanya, dan mengirimkan hasilnya ke STDOUT . Untuk memastikan bahwa file sumber tidak berubah, setelah diteruskan ke sed, cukup membukanya. Jika perlu, output dari sed dapat dialihkan ke file, mungkin menimpa file lama. Jika Anda sudah familiar dengan salah satu artikel sebelumnya dalam seri ini, yang membahas tentang pengalihan aliran input dan output, Anda seharusnya bisa melakukan ini.

Menjalankan set perintah saat memanggil sed

Untuk melakukan beberapa operasi pada data, gunakan opsi -e saat memanggil sed. Misalnya, berikut cara mengatur penggantian dua bagian teks:

$ sed -e "s/Ini/Itu/; s/tes/tes lain/" ./file saya


Menggunakan tombol -e saat memanggil sed

Kedua perintah tersebut diterapkan ke setiap baris teks dari file. Mereka harus dipisahkan dengan titik koma, dan tidak boleh ada spasi antara akhir perintah dan titik koma.
Untuk memasukkan beberapa pola pemrosesan teks saat memanggil sed, Anda dapat, setelah memasukkan kutipan tunggal pertama, tekan Enter, lalu masukkan setiap aturan pada baris baru, jangan lupa kutipan penutup:

$ sed -e "> s/Ini/Itu/ > s/tes/tes lain/" ./file saya
Inilah yang terjadi setelah perintah yang disajikan dalam formulir ini dijalankan.


Cara lain untuk bekerja dengan sed

Membaca perintah dari file

Jika ada banyak perintah sed untuk memproses teks, biasanya yang terbaik adalah menuliskannya ke file terlebih dahulu. Untuk memberi tahu sed file yang berisi perintah, gunakan tombol -f:

Berikut isi file perintah saya:

S/Ini/Itu/ s/tes/tes lain/
Mari kita panggil sed, meneruskan ke editor sebuah file dengan perintah dan file untuk diproses:

$ sed -f perintah saya file saya
Hasil pemanggilan perintah seperti itu serupa dengan yang diperoleh pada contoh sebelumnya.


Menggunakan file dengan perintah saat memanggil sed

Ganti bendera perintah

Perhatikan baik-baik contoh berikut.

$ sed "s/test/tes lain/" file saya
Inilah yang ada di dalam file tersebut, dan apa yang akan dihasilkan saat sed memprosesnya.


File sumber dan hasil pengolahannya

Perintah ganti biasanya memproses file yang terdiri dari beberapa baris, tetapi hanya kemunculan pertama dari teks yang dicari pada setiap baris yang diganti. Untuk mengganti semua kemunculan suatu pola, flag yang sesuai harus digunakan.

Sintaks untuk menulis perintah pengganti saat menggunakan flag terlihat seperti ini:

S/pola/penggantian/bendera
Eksekusi perintah ini dapat dimodifikasi dengan beberapa cara.

  • Saat meneruskan nomor tersebut, nomor urut kemunculan pola dalam string diperhitungkan; kemunculan ini akan diganti.
  • Bendera g menunjukkan bahwa semua kemunculan pola dalam string harus diproses.
  • Bendera p menunjukkan bahwa isi string asli harus berupa keluaran.
  • Flag file w memberitahukan perintah untuk menulis hasil pemrosesan teks ke sebuah file.
Pertimbangkan penggunaan varian pertama dari perintah replace, yang menunjukkan posisi kemunculan fragmen yang diinginkan:

$ sed "s/test/tes lain/2" file saya

Memanggil perintah ganti yang menentukan posisi fragmen yang akan diganti

Di sini kami menetapkan, sebagai bendera pengganti, nomor 2. Hal ini menyebabkan fakta bahwa hanya kemunculan kedua dari pola yang diinginkan di setiap baris yang diganti. Sekarang mari kita coba flag pengganti global - g:

$ sed "s/test/tes lain/g" file saya
Seperti yang Anda lihat dari output, perintah ini menggantikan semua kemunculan pola dalam teks.


Penggantian Global

Flag perintah substitusi p memungkinkan keluaran baris yang cocok, sedangkan opsi -n yang ditentukan saat memanggil sed menekan keluaran normal:

$ sed -n "s/test/tes lain/p" file saya
Akibatnya, ketika sed dijalankan dalam konfigurasi ini, hanya baris (dalam kasus kami, satu baris) di mana potongan teks tertentu ditemukan yang ditampilkan di layar.


Menggunakan bendera perintah substitusi p

Mari kita gunakan flag w, yang memungkinkan Anda menyimpan hasil pemrosesan teks ke file:

$ sed "s/test/tes lain/w keluaran" file saya


Menyimpan hasil pemrosesan teks ke file

Terlihat jelas bahwa selama pengoperasian perintah, data dikeluarkan ke STDOUT , sedangkan baris yang diproses ditulis ke file yang namanya ditentukan setelah w .

Karakter pembatas

Bayangkan mengganti /bin/bash dengan /bin/csh di /etc/passwd . Tugasnya tidak terlalu sulit:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Namun, kelihatannya tidak terlalu bagus. Masalahnya adalah karena garis miring digunakan sebagai karakter pemisah, karakter yang sama di baris yang diteruskan ke sed harus di-escape. Akibatnya, keterbacaan perintah menjadi terganggu.

Untungnya, sed memungkinkan kita mengatur sendiri karakter pembatas untuk digunakan dalam perintah pengganti. Pembatas adalah karakter pertama yang muncul setelah s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Dalam hal ini, tanda seru digunakan sebagai pembatas, membuat kode lebih mudah dibaca dan lebih bersih dari sebelumnya.

Memilih fragmen teks untuk diproses

Sejauh ini, kami telah memanggil sed untuk memproses semua yang diteruskan ke editor. Dalam beberapa kasus, hanya sebagian teks yang perlu diproses dengan sed - beberapa baris atau kelompok baris tertentu. Ada dua pendekatan untuk mencapai tujuan ini:
  • Tetapkan batas jumlah baris yang diproses.
  • Tentukan filter yang cocok dengan baris yang ingin Anda proses.
Mari kita pertimbangkan pendekatan pertama. Ada dua opsi yang memungkinkan di sini. Yang pertama, dibahas di bawah, mengatur jumlah satu baris yang akan diproses:

$ sed "2s/tes/tes lain/" file saya


Hanya memproses satu baris, nomor yang diberikan saat memanggil sed

Opsi kedua adalah serangkaian string:

$ sed "2,3s/tes/tes lain/" file saya


Penanganan Rentang Baris

Selain itu, Anda dapat memanggil perintah ganti agar file diproses dari baris tertentu hingga akhir:

$ sed "2,$s/tes/tes lain/" file saya


Memproses file dari baris kedua hingga akhir

Untuk memproses hanya baris yang cocok dengan filter yang ditentukan menggunakan perintah ganti, perintah harus dipanggil seperti ini:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Dengan analogi dengan apa yang telah dibahas di atas, templat dilewatkan sebelum nama perintah s .


Memproses Baris yang Cocok dengan Filter

Di sini kami menggunakan filter yang sangat sederhana. Untuk mengungkap sepenuhnya kemungkinan pendekatan ini, Anda dapat menggunakan ekspresi reguler. Kami akan membicarakannya di salah satu artikel berikut dalam seri ini.

Menghapus baris

Utilitas sed berguna untuk lebih dari sekedar mengganti urutan karakter dalam string dengan yang lain. Dengan bantuannya, yaitu menggunakan perintah d, Anda dapat menghapus baris dari aliran teks.

Panggilan perintah terlihat seperti ini:

$ sed "3d" file saya
Kami ingin baris ketiga dihapus dari teks. Perhatikan bahwa ini bukan file. File tidak akan berubah, penghapusan hanya akan mempengaruhi output yang dihasilkan oleh sed.


Menghapus baris ketiga

Jika Anda tidak menentukan nomor baris yang akan dihapus saat memanggil perintah d, semua baris di aliran akan dihapus.

Berikut cara menerapkan perintah d ke serangkaian baris:

$ sed "2,3d" file saya


Menghapus Rentang Baris

Dan berikut cara menghapus baris, mulai dari baris tertentu - hingga akhir file:

$ sed "3,$d" file saya


Hapus baris ke akhir file

Baris juga dapat dihapus sesuai pola:

$ sed "/test/d" file saya


Menghapus string berdasarkan pola

Saat memanggil d, Anda dapat menentukan beberapa pola - garis di mana pola tersebut muncul, dan garis di antara pola tersebut, akan dihapus:

$ sed "/detik/,/keempat/d" file saya


Menghapus Rentang Baris Menggunakan Pola

Memasukkan teks ke dalam aliran

Dengan sed, Anda dapat memasukkan data ke dalam aliran teks menggunakan perintah i dan a:
  • Perintah i menambahkan baris baru sebelum baris yang diberikan.
  • Perintah a menambahkan baris baru setelah baris yang diberikan.
Perhatikan contoh penggunaan perintah i:

$ echo "Tes lagi" | sed "i\Tes pertama"


Tim i

Sekarang mari kita lihat perintah a:

$ echo "Tes lagi" | sed "a\Tes pertama"


Tim a

Seperti yang Anda lihat, perintah ini menambahkan teks sebelum atau sesudah data dari aliran. Bagaimana jika Anda perlu menambahkan garis di tengah-tengah?

Disini kita akan terbantu dengan menentukan nomor garis referensi pada stream, atau template. Perhatikan bahwa menangani string sebagai rentang tidak akan berfungsi di sini. Mari kita panggil perintah i, tentukan nomor baris sebelum kita ingin menyisipkan baris baru:

$ sed "2i\Ini adalah baris yang disisipkan." file saya


saya perintahkan dengan nomor baris referensi

Mari kita lakukan hal yang sama dengan perintah a:

$ sed "2a\Ini adalah baris yang ditambahkan." file saya


Perintah a dengan nomor baris referensi

Perhatikan perbedaan cara kerja perintah i dan a. Yang pertama menyisipkan baris baru sebelum baris yang ditentukan, yang kedua - setelahnya.

Penggantian tali

Perintah c memungkinkan Anda mengubah konten seluruh baris teks dalam aliran data. Saat memanggilnya, Anda perlu menentukan nomor baris, alih-alih data baru mana yang harus ditambahkan ke aliran:

$ sed "3c\Ini adalah baris yang dimodifikasi." file saya


Mengganti seluruh string

Jika Anda menggunakan pola dalam bentuk teks biasa atau ekspresi reguler saat memanggil perintah, semua baris yang cocok dengan pola tersebut akan diganti:

$ sed "/Ini/c Ini adalah baris teks yang diubah." file saya


Mengganti string dengan pola

Substitusi karakter

Perintah y beroperasi pada karakter individual, menggantinya sesuai dengan data yang diteruskan ke karakter tersebut saat dipanggil:

$sed "y/123/567/"file saya


Substitusi karakter

Saat menggunakan perintah ini, Anda perlu memperhitungkan bahwa ini berlaku untuk seluruh aliran teks, Anda tidak dapat membatasinya pada kemunculan karakter tertentu.

Menampilkan nomor baris

Jika Anda memanggil sed menggunakan perintah =, utilitas akan mencetak nomor baris dalam aliran data:

$sed "="file saya


Menampilkan nomor baris

Editor aliran mengeluarkan nomor baris sebelum isinya.

Jika Anda meneruskan pola ke perintah ini dan menggunakan opsi sed -n, hanya nomor baris yang cocok dengan pola tersebut yang akan dicetak:

$ sed -n "/test/=" file saya


Menampilkan nomor baris yang cocok dengan suatu pola

Membaca data yang akan disisipkan dari suatu file

Di atas, kita melihat teknik untuk memasukkan data ke dalam aliran, menunjukkan apa yang harus dimasukkan, tepat saat memanggil sed. Anda juga dapat menggunakan file sebagai sumber data. Untuk melakukan ini, gunakan perintah r, yang memungkinkan Anda memasukkan data dari file tertentu ke dalam aliran. Saat memanggilnya, Anda dapat menentukan nomor baris yang ingin Anda masukkan konten file, atau templatnya.

Perhatikan sebuah contoh:

$ sed "3r file baru" file saya


Memasukkan Konten File ke dalam Aliran

Di sini konten newfile telah disisipkan setelah baris ketiga myfile .

Inilah yang terjadi jika Anda menggunakan templat saat memanggil perintah r:

$ sed "/test/r file baru" file saya


Menggunakan wildcard saat menjalankan perintah r

Isi file akan disisipkan setelah setiap baris yang cocok dengan polanya.

Contoh

Mari kita bayangkan tugas seperti itu. Ada sebuah file yang didalamnya terdapat rangkaian karakter tertentu, tidak ada artinya sendiri, yang harus diganti dengan data yang diambil dari file lain. Yaitu, biarlah itu menjadi file newfile , di mana urutan karakter DATA berperan sebagai placeholder. Data yang akan diganti DATA disimpan dalam file data.

Anda dapat mengatasi masalah ini menggunakan perintah r dan d dari editor sed stream:

$ Sed "/DATA>/ ( r file baru d)" file saya


Mengganti placeholder dengan data nyata

Seperti yang Anda lihat, alih-alih placeholder DATA, sed menambahkan dua baris dari file data ke aliran keluaran.

Hasil

Hari ini kita membahas dasar-dasar bekerja dengan editor sed stream. Faktanya, sed adalah topik yang sangat besar. Mempelajarinya dapat dibandingkan dengan mempelajari bahasa pemrograman baru, tetapi setelah Anda memahami dasar-dasarnya, Anda dapat menguasai sed ke tingkat mana pun yang Anda perlukan. Akibatnya, kemampuan Anda mengolah teks dengannya hanya akan dibatasi oleh imajinasi Anda.

Itu saja untuk hari ini. Lain kali kita akan berbicara tentang bahasa pemrosesan data awk.

Pembaca yang budiman! Apakah Anda menggunakan sed dalam pekerjaan sehari-hari Anda? Jika ya, silakan bagikan pengalaman Anda.

Terakhir kali kita berbicara tentang fungsi dalam skrip bash, khususnya cara memanggilnya dari baris perintah. Topik kita hari ini adalah alat yang sangat berguna untuk memproses data string - utilitas Linux bernama sed. Ini sering digunakan untuk bekerja dengan teks yang terlihat seperti file log, file konfigurasi, dan file lainnya.



Jika Anda menangani data dengan cara tertentu dalam skrip bash, Anda harus terbiasa dengan alat sed dan gawk. Di sini kita akan fokus pada sed dan bekerja dengan teks, karena ini adalah langkah yang sangat penting dalam perjalanan kita melalui pengembangan skrip bash yang luas.

Sekarang kita akan menganalisis dasar-dasar bekerja dengan sed, serta melihat lebih dari tiga lusin contoh penggunaan alat ini.

dasar-dasar sed

Utilitas sed disebut editor teks aliran. Editor teks interaktif seperti nano bekerja dengan teks menggunakan keyboard, mengedit file, menambah, menghapus, atau mengubah teks. Sed memungkinkan Anda mengedit aliran data berdasarkan seperangkat aturan yang ditentukan oleh pengembang. Berikut skema pemanggilan perintah ini:

$ sed berkas opsi
Secara default, sed menerapkan aturan yang ditentukan saat dipanggil, dinyatakan sebagai sekumpulan perintah, ke STDIN . Ini memungkinkan data diteruskan langsung ke sed.

Misalnya seperti ini:

$ echo "Ini adalah ujian" | sed "s/tes/tes lain/"
Inilah yang terjadi ketika Anda menjalankan perintah ini.


Contoh panggilan sed sederhana

Dalam hal ini, sed mengganti kata "test" dalam string yang diteruskan untuk diproses dengan kata "test lain". Garis miring lurus digunakan untuk memformat aturan pemrosesan teks yang diapit tanda kutip. Dalam kasus kami, perintah seperti s/pattern1/pattern2/ digunakan. Huruf "s" merupakan singkatan dari kata "pengganti", artinya kita mempunyai tim pengganti. Sed, dengan menjalankan perintah ini, akan melihat teks yang ditransfer dan mengganti fragmen yang ditemukan di dalamnya (kita akan membicarakan yang mana, kita akan membicarakannya di bawah), sesuai dengan pattern1 , dengan pattern2 .

Di atas adalah contoh primitif penggunaan sed, hanya untuk membantu Anda memulai. Faktanya, sed dapat digunakan dalam skenario pemrosesan kata yang jauh lebih kompleks, seperti bekerja dengan file.

Di bawah ini adalah file yang berisi potongan teks, dan hasil pengolahannya dengan perintah ini:

$ sed "s/test/tes lain" ./filesaya


File teks dan hasil pengolahannya

Di sini pendekatan yang sama seperti yang kami gunakan di atas diterapkan, tetapi sekarang sed memproses teks yang disimpan dalam file. Namun, jika file tersebut cukup besar, Anda akan melihat bahwa sed memproses data dalam beberapa bagian dan menampilkan apa yang diproses di layar, tanpa menunggu seluruh file diproses.

Sed tidak mengubah data dalam file yang sedang diproses. Editor membaca file, memproses apa yang dibacanya, dan mengirimkan hasilnya ke STDOUT . Untuk memastikan bahwa file sumber tidak berubah, setelah diteruskan ke sed, cukup membukanya. Jika perlu, output dari sed dapat dialihkan ke file, mungkin menimpa file lama. Jika Anda sudah familiar dengan salah satu artikel sebelumnya dalam seri ini, yang membahas tentang pengalihan aliran input dan output, Anda seharusnya bisa melakukan ini.

Menjalankan set perintah saat memanggil sed

Untuk melakukan beberapa operasi pada data, gunakan opsi -e saat memanggil sed. Misalnya, berikut cara mengatur penggantian dua bagian teks:

$ sed -e "s/Ini/Itu/; s/tes/tes lain/" ./file saya


Menggunakan tombol -e saat memanggil sed

Kedua perintah tersebut diterapkan ke setiap baris teks dari file. Mereka harus dipisahkan dengan titik koma, dan tidak boleh ada spasi antara akhir perintah dan titik koma.
Untuk memasukkan beberapa pola pemrosesan teks saat memanggil sed, Anda dapat, setelah memasukkan kutipan tunggal pertama, tekan Enter, lalu masukkan setiap aturan pada baris baru, jangan lupa kutipan penutup:

$ sed -e "> s/Ini/Itu/ > s/tes/tes lain/" ./file saya
Inilah yang terjadi setelah perintah yang disajikan dalam formulir ini dijalankan.


Cara lain untuk bekerja dengan sed

Membaca perintah dari file

Jika ada banyak perintah sed untuk memproses teks, biasanya yang terbaik adalah menuliskannya ke file terlebih dahulu. Untuk memberi tahu sed file yang berisi perintah, gunakan tombol -f:

Berikut isi file perintah saya:

S/Ini/Itu/ s/tes/tes lain/
Mari kita panggil sed, meneruskan ke editor sebuah file dengan perintah dan file untuk diproses:

$ sed -f perintah saya file saya
Hasil pemanggilan perintah seperti itu serupa dengan yang diperoleh pada contoh sebelumnya.


Menggunakan file dengan perintah saat memanggil sed

Ganti bendera perintah

Perhatikan baik-baik contoh berikut.

$ sed "s/test/tes lain/" file saya
Inilah yang ada di dalam file tersebut, dan apa yang akan dihasilkan saat sed memprosesnya.


File sumber dan hasil pengolahannya

Perintah ganti biasanya memproses file yang terdiri dari beberapa baris, tetapi hanya kemunculan pertama dari teks yang dicari pada setiap baris yang diganti. Untuk mengganti semua kemunculan suatu pola, flag yang sesuai harus digunakan.

Sintaks untuk menulis perintah pengganti saat menggunakan flag terlihat seperti ini:

S/pola/penggantian/bendera
Eksekusi perintah ini dapat dimodifikasi dengan beberapa cara.

  • Saat meneruskan nomor tersebut, nomor urut kemunculan pola dalam string diperhitungkan; kemunculan ini akan diganti.
  • Bendera g menunjukkan bahwa semua kemunculan pola dalam string harus diproses.
  • Bendera p menunjukkan bahwa isi string asli harus berupa keluaran.
  • Flag file w memberitahukan perintah untuk menulis hasil pemrosesan teks ke sebuah file.
Pertimbangkan penggunaan varian pertama dari perintah replace, yang menunjukkan posisi kemunculan fragmen yang diinginkan:

$ sed "s/test/tes lain/2" file saya

Memanggil perintah ganti yang menentukan posisi fragmen yang akan diganti

Di sini kami menetapkan, sebagai bendera pengganti, nomor 2. Hal ini menyebabkan fakta bahwa hanya kemunculan kedua dari pola yang diinginkan di setiap baris yang diganti. Sekarang mari kita coba flag pengganti global - g:

$ sed "s/test/tes lain/g" file saya
Seperti yang Anda lihat dari output, perintah ini menggantikan semua kemunculan pola dalam teks.


Penggantian Global

Flag perintah substitusi p memungkinkan keluaran baris yang cocok, sedangkan opsi -n yang ditentukan saat memanggil sed menekan keluaran normal:

$ sed -n "s/test/tes lain/p" file saya
Akibatnya, ketika sed dijalankan dalam konfigurasi ini, hanya baris (dalam kasus kami, satu baris) di mana potongan teks tertentu ditemukan yang ditampilkan di layar.


Menggunakan bendera perintah substitusi p

Mari kita gunakan flag w, yang memungkinkan Anda menyimpan hasil pemrosesan teks ke file:

$ sed "s/test/tes lain/w keluaran" file saya


Menyimpan hasil pemrosesan teks ke file

Terlihat jelas bahwa selama pengoperasian perintah, data dikeluarkan ke STDOUT , sedangkan baris yang diproses ditulis ke file yang namanya ditentukan setelah w .

Karakter pembatas

Bayangkan mengganti /bin/bash dengan /bin/csh di /etc/passwd . Tugasnya tidak terlalu sulit:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Namun, kelihatannya tidak terlalu bagus. Masalahnya adalah karena garis miring digunakan sebagai karakter pemisah, karakter yang sama di baris yang diteruskan ke sed harus di-escape. Akibatnya, keterbacaan perintah menjadi terganggu.

Untungnya, sed memungkinkan kita mengatur sendiri karakter pembatas untuk digunakan dalam perintah pengganti. Pembatas adalah karakter pertama yang muncul setelah s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Dalam hal ini, tanda seru digunakan sebagai pembatas, membuat kode lebih mudah dibaca dan lebih bersih dari sebelumnya.

Memilih fragmen teks untuk diproses

Sejauh ini, kami telah memanggil sed untuk memproses semua yang diteruskan ke editor. Dalam beberapa kasus, hanya sebagian teks yang perlu diproses dengan sed - beberapa baris atau kelompok baris tertentu. Ada dua pendekatan untuk mencapai tujuan ini:
  • Tetapkan batas jumlah baris yang diproses.
  • Tentukan filter yang cocok dengan baris yang ingin Anda proses.
Mari kita pertimbangkan pendekatan pertama. Ada dua opsi yang memungkinkan di sini. Yang pertama, dibahas di bawah, mengatur jumlah satu baris yang akan diproses:

$ sed "2s/tes/tes lain/" file saya


Hanya memproses satu baris, nomor yang diberikan saat memanggil sed

Opsi kedua adalah serangkaian string:

$ sed "2,3s/tes/tes lain/" file saya


Penanganan Rentang Baris

Selain itu, Anda dapat memanggil perintah ganti agar file diproses dari baris tertentu hingga akhir:

$ sed "2,$s/tes/tes lain/" file saya


Memproses file dari baris kedua hingga akhir

Untuk memproses hanya baris yang cocok dengan filter yang ditentukan menggunakan perintah ganti, perintah harus dipanggil seperti ini:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Dengan analogi dengan apa yang telah dibahas di atas, templat dilewatkan sebelum nama perintah s .


Memproses Baris yang Cocok dengan Filter

Di sini kami menggunakan filter yang sangat sederhana. Untuk mengungkap sepenuhnya kemungkinan pendekatan ini, Anda dapat menggunakan ekspresi reguler. Kami akan membicarakannya di salah satu artikel berikut dalam seri ini.

Menghapus baris

Utilitas sed berguna untuk lebih dari sekedar mengganti urutan karakter dalam string dengan yang lain. Dengan bantuannya, yaitu menggunakan perintah d, Anda dapat menghapus baris dari aliran teks.

Panggilan perintah terlihat seperti ini:

$ sed "3d" file saya
Kami ingin baris ketiga dihapus dari teks. Perhatikan bahwa ini bukan file. File tidak akan berubah, penghapusan hanya akan mempengaruhi output yang dihasilkan oleh sed.


Menghapus baris ketiga

Jika Anda tidak menentukan nomor baris yang akan dihapus saat memanggil perintah d, semua baris di aliran akan dihapus.

Berikut cara menerapkan perintah d ke serangkaian baris:

$ sed "2,3d" file saya


Menghapus Rentang Baris

Dan berikut cara menghapus baris, mulai dari baris tertentu - hingga akhir file:

$ sed "3,$d" file saya


Hapus baris ke akhir file

Baris juga dapat dihapus sesuai pola:

$ sed "/test/d" file saya


Menghapus string berdasarkan pola

Saat memanggil d, Anda dapat menentukan beberapa pola - garis di mana pola tersebut muncul, dan garis di antara pola tersebut, akan dihapus:

$ sed "/detik/,/keempat/d" file saya


Menghapus Rentang Baris Menggunakan Pola

Memasukkan teks ke dalam aliran

Dengan sed, Anda dapat memasukkan data ke dalam aliran teks menggunakan perintah i dan a:
  • Perintah i menambahkan baris baru sebelum baris yang diberikan.
  • Perintah a menambahkan baris baru setelah baris yang diberikan.
Perhatikan contoh penggunaan perintah i:

$ echo "Tes lagi" | sed "i\Tes pertama"


Tim i

Sekarang mari kita lihat perintah a:

$ echo "Tes lagi" | sed "a\Tes pertama"


Tim a

Seperti yang Anda lihat, perintah ini menambahkan teks sebelum atau sesudah data dari aliran. Bagaimana jika Anda perlu menambahkan garis di tengah-tengah?

Disini kita akan terbantu dengan menentukan nomor garis referensi pada stream, atau template. Perhatikan bahwa menangani string sebagai rentang tidak akan berfungsi di sini. Mari kita panggil perintah i, tentukan nomor baris sebelum kita ingin menyisipkan baris baru:

$ sed "2i\Ini adalah baris yang disisipkan." file saya


saya perintahkan dengan nomor baris referensi

Mari kita lakukan hal yang sama dengan perintah a:

$ sed "2a\Ini adalah baris yang ditambahkan." file saya


Perintah a dengan nomor baris referensi

Perhatikan perbedaan cara kerja perintah i dan a. Yang pertama menyisipkan baris baru sebelum baris yang ditentukan, yang kedua - setelahnya.

Penggantian tali

Perintah c memungkinkan Anda mengubah konten seluruh baris teks dalam aliran data. Saat memanggilnya, Anda perlu menentukan nomor baris, alih-alih data baru mana yang harus ditambahkan ke aliran:

$ sed "3c\Ini adalah baris yang dimodifikasi." file saya


Mengganti seluruh string

Jika Anda menggunakan pola dalam bentuk teks biasa atau ekspresi reguler saat memanggil perintah, semua baris yang cocok dengan pola tersebut akan diganti:

$ sed "/Ini/c Ini adalah baris teks yang diubah." file saya


Mengganti string dengan pola

Substitusi karakter

Perintah y beroperasi pada karakter individual, menggantinya sesuai dengan data yang diteruskan ke karakter tersebut saat dipanggil:

$sed "y/123/567/"file saya


Substitusi karakter

Saat menggunakan perintah ini, Anda perlu memperhitungkan bahwa ini berlaku untuk seluruh aliran teks, Anda tidak dapat membatasinya pada kemunculan karakter tertentu.

Menampilkan nomor baris

Jika Anda memanggil sed menggunakan perintah =, utilitas akan mencetak nomor baris dalam aliran data:

$sed "="file saya


Menampilkan nomor baris

Editor aliran mengeluarkan nomor baris sebelum isinya.

Jika Anda meneruskan pola ke perintah ini dan menggunakan opsi sed -n, hanya nomor baris yang cocok dengan pola tersebut yang akan dicetak:

$ sed -n "/test/=" file saya


Menampilkan nomor baris yang cocok dengan suatu pola

Membaca data yang akan disisipkan dari suatu file

Di atas, kita melihat teknik untuk memasukkan data ke dalam aliran, menunjukkan apa yang harus dimasukkan, tepat saat memanggil sed. Anda juga dapat menggunakan file sebagai sumber data. Untuk melakukan ini, gunakan perintah r, yang memungkinkan Anda memasukkan data dari file tertentu ke dalam aliran. Saat memanggilnya, Anda dapat menentukan nomor baris yang ingin Anda masukkan konten file, atau templatnya.

Perhatikan sebuah contoh:

$ sed "3r file baru" file saya


Memasukkan Konten File ke dalam Aliran

Di sini konten newfile telah disisipkan setelah baris ketiga myfile .

Inilah yang terjadi jika Anda menggunakan templat saat memanggil perintah r:

$ sed "/test/r file baru" file saya


Menggunakan wildcard saat menjalankan perintah r

Isi file akan disisipkan setelah setiap baris yang cocok dengan polanya.

Contoh

Mari kita bayangkan tugas seperti itu. Ada sebuah file yang didalamnya terdapat rangkaian karakter tertentu, tidak ada artinya sendiri, yang harus diganti dengan data yang diambil dari file lain. Yaitu, biarlah itu menjadi file newfile , di mana urutan karakter DATA berperan sebagai placeholder. Data yang akan diganti DATA disimpan dalam file data.

Anda dapat mengatasi masalah ini menggunakan perintah r dan d dari editor sed stream:

$ Sed "/DATA>/ ( r file baru d)" file saya


Mengganti placeholder dengan data nyata

Seperti yang Anda lihat, alih-alih placeholder DATA, sed menambahkan dua baris dari file data ke aliran keluaran.

Hasil

Hari ini kita membahas dasar-dasar bekerja dengan editor sed stream. Faktanya, sed adalah topik yang sangat besar. Mempelajarinya dapat dibandingkan dengan mempelajari bahasa pemrograman baru, tetapi setelah Anda memahami dasar-dasarnya, Anda dapat menguasai sed ke tingkat mana pun yang Anda perlukan. Akibatnya, kemampuan Anda mengolah teks dengannya hanya akan dibatasi oleh imajinasi Anda.

Itu saja untuk hari ini. Lain kali kita akan berbicara tentang bahasa pemrosesan data awk.

Pembaca yang budiman! Apakah Anda menggunakan sed dalam pekerjaan sehari-hari Anda? Jika ya, silakan bagikan pengalaman Anda.

Perkenalan

Perintah sed adalah Stream EDitor untuk mengedit teks secara otomatis. "Editor aliran" - dalam arti dapat mengedit aliran data yang masuk secara terus menerus, katakanlah, sebagai bagian dari saluran program (pipa). Otomatis - ini berarti segera setelah Anda menetapkan aturan pengeditan, sisanya terjadi tanpa partisipasi Anda yang membosankan. Dengan kata lain, sed tidak interaktif.

Program sed lebih kompleks daripada perintah yang telah kita bahas di artikel sebelumnya di seri HuMan. Ia memiliki gudang perintahnya sendiri, jadi untuk menghindari tautologi dan kebingungan, dalam artikel ini perintah sed selanjutnya akan disebut sebagai "program" atau "editor", dan perintah editor sed hanya sebagai perintah.

Program sed mampu melakukan tugas-tugas kompleks, dan memerlukan waktu untuk mempelajari cara merumuskan tugas-tugas tersebut.

Namun seiring dengan tindakan yang kompleks, perintah sed memiliki fitur sederhana namun sangat berguna yang tidak lebih sulit untuk dikuasai dibandingkan perintah Unix lainnya. Jangan biarkan diri Anda sendiri, karena rumitnya penguasaan keseluruhan program, meninggalkan aspek-aspek sederhananya.

Kami akan mulai dari yang sederhana hingga yang rumit, sehingga Anda selalu dapat mengetahui di mana harus berhenti.

Perintah s - substitusi (penggantian)

Program sed memiliki banyak perintah asli. Sebagian besar pengguna hanya mengetahui perintah s, dan ini cukup untuk bekerja dengan editor sed. Perintah s menggantikan POLA dengan REPLACE:

sed s /CONTOH/GANTI/

$ hari gema | sed s /siang/malam/ (Masuk) malam

Itu tidak menjadi lebih mudah. Dan berikut ini contoh input dari file zar.txt:

Di pagi hari dia melakukan latihan. Petir adalah muatan listrik. $ sed s/charge/discharge/ zar.txt Di pagi hari dia akan keluar. Petir adalah pelepasan muatan listrik.

Saya tidak mengutip s/PATTERN/REPLACEMENT/ karena contoh ini tidak memerlukan tanda kutip, tetapi jika ada metakarakter, tanda kutip akan diperlukan. Agar tidak pusing setiap saat, dan tidak membuat kesalahan secara tidak sengaja, selalu beri tanda petik, lebih baik dari yang lebih "kuat", ini kebiasaan yang baik. Anda tidak akan merusak bubur dengan mentega. Saya juga tidak akan berhemat pada kutipan dalam semua contoh berikutnya.

Seperti yang bisa kita lihat, perintah pengganti s memiliki empat komponen:

Perintah S itu sendiri /.../.../ pembatas pola POLA untuk mencari dan kemudian mengganti ekspresi REPLACE yang akan menggantikan POLA jika ditemukan.

Garis miring (/) secara tradisional digunakan sebagai pembatas, seperti yang digunakan oleh sed leluhur ed (seperti halnya vi). Dalam beberapa kasus, pemisah seperti itu sangat merepotkan, misalnya ketika Anda perlu mengubah jalur (path) ke direktori yang juga mengandung garis miring (/usr/local/bin). Dalam hal ini, Anda harus memisahkan garis miring ke depan dengan garis miring ke belakang:

Sed "s/\/usr\/local\/bin/\/common\/bin/"

Ini disebut "palisade" dan terlihat sangat jelek, dan yang terpenting, tidak dapat dipahami.

Keunikan sed adalah memungkinkan Anda menggunakan pembatas apa pun, seperti garis bawah:

$ hari gema | sed s_siang_malam_ malam

atau titik dua:

$ hari gema | sed s:hari:malam: malam

Jika mencari pembatas yang Anda suka, Anda mendapatkan pesan "perintah tidak lengkap `s"", maka karakter ini tidak cocok sebagai pembatas, atau Anda lupa memasang satu atau dua pembatas.

Pada artikel kali ini saya terpaksa menggunakan tanda pemisah tradisional (/) agar tidak membingungkan pembaca, namun bila perlu saya akan menggunakan tanda tilde (~) sebagai pemisah.

Ekspresi Reguler (RE)

(Ekspresi reguler, regexp, RE)

Topik ekspresi reguler sangat luas sehingga seluruh buku membahasnya (lihat tautan di akhir artikel). Namun, membicarakan sed secara serius tanpa menggunakan ekspresi reguler sama tidak produktifnya dengan membicarakan trigonometri dengan tongkat hitung. Oleh karena itu, penting untuk membicarakan setidaknya tentang ekspresi reguler yang sering digunakan dengan program sed.

Dengan Atau surat lainnya. Kebanyakan huruf, angka, dan karakter non-khusus lainnya diperlakukan sebagai ekspresi reguler yang mewakili dirinya sendiri.

* Tanda bintang yang mengikuti karakter atau ekspresi reguler apa pun berarti sejumlah (termasuk nol) pengulangan karakter atau ekspresi reguler ini.

\+ Berarti satu atau lebih pengulangan karakter atau ekspresi reguler.

\? Berarti tidak ada atau satu pengulangan.

\(Saya\) Berarti persis saya pengulangan.

\(aku j\) Jumlah pengulangan berkisar dari i hingga j inklusif.

\(Saya,\) Jumlah pengulangan lebih besar atau sama dengan i.

\(,J\) Banyaknya pengulangan kurang dari atau sama dengan j.

\(ULANG\) Ingat ekspresi reguler atau sebagiannya untuk tujuan penggunaan lebih lanjut secara keseluruhan. Misalnya, \(a-z\)* akan cocok dengan kombinasi angka apa pun (termasuk nol) huruf kecil.

. Berarti karakter apa pun, termasuk karakter baris baru.

^ Berarti ekspresi nol di awal string. Dengan kata lain, apapun yang didahului oleh karakter ini harus muncul di awal baris. Misalnya, ^#include akan mencari baris yang dimulai dengan #include.

$ Sama seperti di atas, hanya berlaku pada akhir baris.

[DAFTAR] Berarti karakter apa pun dari DAFTAR. Misalnya, ia akan mencari vokal bahasa Inggris apa pun.

[^DAFTAR] Berarti karakter apa pun kecuali yang ada dalam daftar. Misalnya, [^aeiou] akan mencari konsonan apa pun. Catatan: LIST dapat berupa interval, seperti [a-z], yang berarti huruf kecil apa pun. Jika Anda ingin memasukkan tanda ] (kurung siku) ke dalam DAFTAR, letakkan di urutan pertama dalam daftar; jika ingin memasukkan - (tanda hubung) ke dalam DAFTAR, tentukan terlebih dahulu atau terakhir di daftar.

RE1\|RE2 Berarti PB1 atau PB2.

RE1RE2 Berarti gabungan ekspresi reguler PB1 dan PB2.

\N Menunjukkan karakter baris baru.

\$; \*; \.; \[; \\; \^ Artinya masing-masing: $; *; .; [; \; ^

Perhatian: Konvensi garis miring terbalik (\) lainnya yang digunakan di C tidak didukung oleh sed.

\1 \2 \3 \4 \5 \6 \7 \8 \9 Berarti bagian yang cocok dari ekspresi reguler, disimpan menggunakan \(dan \).

Beberapa contoh:

abcdef Berarti abcdef

a*b Berarti nol atau sejumlah huruf a dan satu huruf b. Misalnya, aaaaaab; ab; atau b.

a\?b Berarti b atau ab

a\+b\+ Berarti satu atau lebih huruf a dan satu atau lebih huruf b. Misalnya: ab; aaab; abbbbb; atau aaaaabbbbbb.

.* Berarti semua karakter pada baris, pada semua baris, termasuk yang kosong.

.\+ Berarti semua karakter dalam sebuah string, tetapi hanya pada string yang berisi setidaknya satu karakter. Baris kosong tidak cocok dengan ekspresi reguler yang diberikan.

^utama.*(.*) Ini akan mencari baris yang dimulai dengan kata main, serta baris yang mengandung tanda kurung buka dan tutup, dan sejumlah karakter mungkin ada atau tidak sebelum dan sesudah tanda kurung buka.

^# Akan mencari baris yang dimulai dengan tanda # (misalnya komentar).

\\$ Akan mencari garis yang diakhiri dengan garis miring terbalik (\).

Huruf atau angka apa pun

[^ ]\+ (Kurung siku, selain karakter ^, juga berisi spasi dan tab) -- Berarti satu atau sejumlah karakter apa pun, kecuali spasi dan tab. Biasanya itu berarti sebuah kata.

^.*A.*$ Artinya huruf kapital A tepat di tengah baris.

A.\(9\)$ Menunjukkan huruf kapital A, tepat sepersepuluh dari akhir baris.

^.\(,15\)A Berarti huruf kapital A, tepatnya keenam belas dari awal baris.

Sekarang kita telah melihat beberapa ekspresi reguler, mari kembali ke perintah sed.

Menggunakan & ketika POLA tidak diketahui "Bagaimana ini tidak diketahui?" Anda bertanya - "Apakah Anda tidak tahu apa yang ingin Anda ganti?" Jawaban: Saya ingin memasukkan nomor apa pun yang ditemukan dalam teks dalam tanda kurung. Bagaimana cara melakukannya? Jawaban: gunakan simbol &.

Karakter & (ampersand), bila ditempatkan di REPLACEMENT, berarti POLA apa pun yang ditemukan dalam teks. Misalnya:

$ gema 1234 | sed "s/*/(&)/" (1234)

Tanda bintang (asterisk) setelah interval diperlukan untuk menggantikan semua digit yang ditemukan dalam sampel. Tanpa itu, itu akan menjadi:

$ gema 1234 | sed "s//(&)/" (1)234

Artinya, angka pertama yang ditemukan diambil sebagai sampel.

Berikut ini contoh dengan muatan yang sangat berarti: mari kita buat file formula.txt:

A+432-10=n

dan terapkan perintah padanya:

$ sed "s/*-*/(&)/" rumus.txt a+(432-10)=n

Rumus matematika telah memperoleh arti yang jelas.

Karakter ampersand lain dapat digunakan untuk menggandakan POLA:

$ gema 123 | sed "s/*/& &/" 123 123

Ada satu kehalusan di sini. Jika kita sedikit memperumit contohnya:

$gema"123abc"| sed "s/*/& &/" 123 123 abc

seperti yang diharapkan, hanya angka yang digandakan, karena tidak ada huruf di POLA. Namun jika kita menukar bagian teks:

$ gema "abc 123" | sed "s/*/& &/" abc 123

maka penggandaan angka tidak akan berhasil. Ini adalah fitur ekspresi reguler * - hanya cocok dengan karakter pertama dari string. Jika kita ingin menggandakan angka di mana pun mereka berada, kita perlu mengubah ekspresi reguler di REPLACE:

$gema"abc defg 123"| sed "s/*/& &/" abc defg 123 123

maka angkanya akan menjadi dua kali lipat, berapa pun jumlah "kata" sebelumnya.

Menggunakan karakter escape \(, \) dan \1 untuk menangani bagian POLA Karakter escape \( dan \) (tanda kurung yang di-escape) digunakan untuk mengingat bagian ekspresi reguler.

Simbol \1 berarti bagian pertama yang dihafal, \2 - bagian kedua, dan seterusnya, hingga sembilan bagian yang dihafal (program tidak mendukung lebih banyak lagi). Mari kita ambil contoh:

$ gema abcd123 | sed "s/\(*\).*/\1/" abcd

Di sini \(*\) berarti program harus mengingat semua karakter alfabet dalam jumlah berapa pun; .* berarti sejumlah karakter setelah bagian pertama yang dihafal; dan \1 artinya kita hanya ingin melihat bagian hafalan pertama saja. Jadi begini: pada keluaran program, kita hanya melihat huruf dan tidak ada angka.

Untuk menukar kata, Anda perlu mengingat dua sub-SAMPEL, lalu menukarnya:

$ echo penguin bodoh |sed "s/\([a-z]*\) \([a-z]*\)/\2 \1/" penguin bodoh

Di sini \2 berarti sub-POLA kedua dan \1 berarti sub-POLA pertama. Perhatikan jarak antara ekspresi pertama \([a-z]*\) dan ekspresi kedua \([a-z]*\). Dua kata perlu ditemukan.

Karakter \1 tidak harus hanya ada di REPLACEMENT, bisa juga ada di PATTERN, misalnya kita ingin menghilangkan kata duplikat:

$gema pinguin pinguin | sed "s/\([a-z]*\) \1/\1/" penguin

Pengubah substitusi perintah s

Pengubah pengganti ditempatkan setelah pembatas terakhir. Pengubah ini menentukan apa yang akan dilakukan program jika ada lebih dari satu POLA yang cocok dalam sebuah string, dan bagaimana cara menggantinya.

/g pengubah

Penggantian global

Program sed, seperti kebanyakan utilitas Unix, membaca baris demi baris saat bekerja dengan file. Jika kita memesan untuk mengganti sebuah kata, program hanya akan mengganti kata pertama yang cocok pada baris tertentu. Jika kita ingin mengubah setiap kata yang sesuai dengan polanya, maka pengubah /g harus dimasukkan.

Tanpa pengubah /g:

$ echo kucing ini adalah kucing yang paling umum | sed "s / cat / puppy /" anak kucing ini adalah kucing paling biasa

Editor hanya mengganti kata pertama yang cocok.

Dan sekarang dengan pengubah pengganti global:

$ echo kucing ini adalah kucing yang paling umum | sed "s/cat/kitten/g" anak kucing ini adalah anak kucing yang paling umum

Semua kecocokan dalam string yang diberikan telah diganti.

Dan jika Anda perlu mengubah semua kata, katakanlah, masukkan ke dalam tanda kurung? Kemudian ekspresi reguler kembali membantu. Untuk memilih semua karakter alfabet, baik huruf besar maupun kecil, Anda dapat menggunakan konstruksi [A-Zaa-z], tetapi kata-kata seperti "sesuatu" atau "dengan" wahana tidak akan termasuk di dalamnya. Konstruksi yang jauh lebih nyaman adalah [ ^ ]* yang cocok dengan semua karakter kecuali spasi, jadi:

$ echo penguin bodoh dengan malu-malu bersembunyi | sed "s/[^ ]*/(&)/g" (konyol) (penguin) (takut-takut) (bersembunyi)

Bagaimana memilih kecocokan yang diinginkan dari beberapa

Jika tidak ada pengubah yang diterapkan, sed hanya akan mengganti kata pertama yang cocok dengan POLA. Jika Anda menerapkan pengubah /g, ​​program akan mengganti setiap kata yang cocok. Dan bagaimana Anda bisa memilih salah satu pertandingan jika ada beberapa pertandingan dalam satu baris? - Dengan menggunakan simbol \(dan \) yang sudah tidak asing lagi bagi kita, ingat sub-SAMPEL dan pilih salah satu yang diperlukan dengan menggunakan simbol \1 - \9.

$gema penguin bodoh | sed "s/\([a-z]*\) \([a-z]*\)/\2 /" penguin

Dalam contoh ini, kita hafal kedua kata tersebut, dan menempatkan kata kedua (penguin) di tempat pertama, kita menghapus kata pertama (bodoh) dengan memberi spasi di bagian PENGGANTI. Jika kita meletakkan kata apa pun selain spasi, maka itu akan menggantikan kata pertama (bodoh):

$gema penguin bodoh | sed "s/\([a-z]*\) \([a-z]*\)/\2 pintar /" penguin pintar

Pengubah numerik

Ini adalah angka satu/dua/tiga digit yang muncul setelah pembatas terakhir dan menunjukkan pertandingan mana yang harus diganti.

$ echo penguin yang sangat bodoh | sed "s/[a-z]*/good/2" penguin yang sangat baik

Dalam contoh ini, setiap kata adalah kecocokan, dan kita telah memberi tahu editor kata mana yang ingin kita ganti dengan memberi pengubah 2 setelah bagian REPLACEMENT.

Anda dapat menggabungkan pengubah digital dengan pengubah /g. Jika Anda perlu membiarkan kata pertama tidak berubah, dan mengganti kata kedua dan selanjutnya dengan kata "(dihapus)", maka perintahnya adalah sebagai berikut:

$ echo penguin yang sangat bodoh | sed "s/[a-z]*/(dihapus)/2g" sangat (dihapus) (dihapus)

Jika Anda benar-benar ingin menghapus semua kecocokan berikutnya kecuali yang pertama, beri spasi di bagian PENGGANTIAN:

$ echo penguin yang sangat bodoh | sed "s/[a-z]*/ /2g" sangat

Atau tidak melakukan apa pun sama sekali:

$ echo penguin yang sangat bodoh | sed "s/[^ ]*//2g" sangat

Pengubah numerik dapat berupa bilangan bulat apa pun dari 1 hingga 512. Misalnya, jika Anda perlu memberi tanda titik dua setelah karakter ke-80 di setiap baris, maka perintah akan membantu:

$ sed "s/./&:/80" nama file

Pengubah /p - keluaran ke keluaran standar (cetak - cetak)

Program sed, secara default, menampilkan hasilnya ke output standar (misalnya, layar monitor). Pengubah ini hanya digunakan dengan opsi sed -n, yang hanya memblokir keluaran hasil ke layar.

/w pengubah

Memungkinkan Anda menulis hasil pemrosesan teks ke file yang ditentukan:

$ sed "s /POLA/GANTI /w nama file

/e pengubah (ekstensi GNU)

Memungkinkan Anda menentukan perintah shell (bukan program sed) sebagai PENGGANTI. Jika ditemukan kecocokan dengan POLA, maka akan digantikan dengan keluaran perintah yang ditentukan di bagian REPLACE. Contoh:

$ gema malam | sed "s/malam/gema hari/e" hari

Pengubah /I dan /i (ekstensi GNU)

Jadikan proses penggantian tidak peka huruf besar-kecil.

$gema Malam | sed "s/malam/siang/i" hari

Kombinasi Pengubah

Pengubah dapat digabungkan jika memungkinkan. Dalam hal ini, pengubah w harus ditempatkan terakhir.

Konvensi (ekstensi GNU) Hanya ada lima di antaranya:

\L mengubah karakter REPLACEMENT menjadi huruf kecil \l mengonversi karakter REPLACE berikutnya menjadi huruf kecil \U mengubah karakter REPLACEMENT menjadi huruf besar \u mengonversi karakter REPLACE berikutnya menjadi huruf besar \E membatalkan terjemahan yang dimulai oleh \L atau \U Untuk alasan yang jelas, konvensi ini digunakan sendiri. Misalnya:

$gema penguin bodoh | sed "s/bodoh/\u&/" Penguin bodoh

$ gema anak anjing kecil | sed "s/[a-z]*/\u&/2" Anak Anjing kecil

Kami telah membahas hampir setiap aspek dari perintah sed. Sekarang giliran untuk mempertimbangkan pilihan program ini.

opsi program sed

Secara mengejutkan, program ini memiliki sedikit pilihan. (Yang agak mengkompensasi kelebihan perintah, pengubah, dan fungsi lainnya). Selain opsi terkenal --help (-h) dan --version (-V), yang tidak akan kami pertimbangkan, hanya ada tiga opsi:

Opsi -e--ekspresi=set perintah

Salah satu cara untuk menjalankan banyak perintah adalah dengan menggunakan opsi -e. Misalnya:

Sed -e "s/a/A/" -e "s/b/B/" nama file

Semua contoh sebelumnya dalam artikel ini tidak memerlukan opsi -e hanya karena berisi satu perintah. Kita bisa memasukkan opsi -e pada contoh, itu tidak akan mengubah apa pun.

Opsi -f Jika Anda perlu menjalankan sejumlah besar perintah, akan lebih mudah untuk menuliskannya ke file dan menggunakan opsi -f:

sed -f nama file skrip sed

Sedscript disini adalah nama file yang berisi perintah-perintah. File ini disebut skrip program sed (selanjutnya hanya skrip). Setiap perintah skrip harus menempati baris terpisah. Misalnya:

# komentar - Skrip ini akan mengubah semua huruf vokal kecil menjadi huruf besar s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g

Anda dapat memberi nama skrip apa pun yang Anda suka, yang penting jangan bingung antara file skrip dengan file yang sedang diproses.

Opsi -n Program sed -n tidak menghasilkan apa pun ke keluaran standar. Untuk mendapatkan outputnya Anda memerlukan instruksi khusus. Kita telah melihat pengubah /p, yang dapat digunakan untuk memberikan indikasi seperti itu. Mari kita ingat file zar.txt:

$ sed "s/1-9/&/p" zar.txt Di pagi hari dia melakukan latihannya. Petir adalah muatan listrik.

Karena tidak ada kecocokan yang ditemukan dengan POLA (tidak ada angka dalam file), perintah s dengan pengubah /p dan tanda & sebagai PENGGANTI (ingat bahwa ampersand berarti POLA itu sendiri) berfungsi seperti perintah cat.

Jika PATTERN ditemukan di file, maka baris yang berisi PATTERN akan digandakan:

$ sed "s/exercises/&/p" zar.txt Di pagi hari dia melakukan latihan. Di pagi hari dia melakukan latihan. Petir adalah muatan listrik.

Sekarang mari tambahkan opsi -n:

$ sed -n "s/charge/&/p" zar.txt Di pagi hari dia melakukan latihannya.

Sekarang program kita bekerja seperti perintah grep - program ini hanya mengembalikan baris yang berisi POLA.

Memilih elemen yang diinginkan dari teks yang dapat diedit

Hanya dengan satu perintah, s, kita telah melihat kekuatan luar biasa dari editor sed. Tapi yang dilakukannya hanyalah mencari dan mengganti. Apalagi dalam proses kerjanya, sed mengedit setiap baris satu per satu, tidak memperhatikan baris lainnya. Akan lebih mudah untuk membatasi rentang garis yang akan diubah, misalnya:

  • Pilih baris berdasarkan nomor
  • Pilih baris dalam rentang angka
  • Pilih hanya baris yang berisi beberapa ekspresi
  • Pilih hanya baris di antara beberapa ekspresi
  • Pilih hanya baris dari awal file hingga beberapa ekspresi
  • Pilih hanya baris dari beberapa ekspresi hingga akhir file

Program sed melakukan semua ini dan lebih banyak lagi. Perintah editor sed apa pun dapat diterapkan berdasarkan alamat, ke rentang alamat, atau dengan batasan rentang baris di atas. Alamat atau batasan harus mendahului perintah:

Sed "perintah alamat/batas"

Pilih baris berdasarkan angka

Ini adalah kasus yang paling sederhana. Cukup tentukan nomor baris yang diinginkan sebelum perintah:

$ sed "4 s/[a-z]*//i" gumilev.txt Sungguh suatu kebahagiaan yang aneh Di awal senja pagi, Dalam mencairnya salju musim semi, bagi semua yang binasa dan bijaksana.

$ sed "3 s/B/(B)/" gumilev.txt Sungguh suatu kebahagiaan yang aneh Di awal senja, (Dalam) mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan bijaksana.

Memilih baris dalam rentang angka

Kisarannya ditunjukkan, tidak mengherankan, dipisahkan dengan koma:

$ sed "2.3 s/B/(B)/" gumilev.txt Sungguh suatu kebahagiaan yang aneh (Dalam) awal senja di pagi hari, (Dalam) mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan bijaksana.

Jika Anda perlu menentukan rentang hingga baris terakhir file, dan Anda tidak tahu berapa banyak baris di dalamnya, gunakan tanda $:

$ sed "2,$ s/in/(in)/i" gumilev.txt Sungguh suatu kebahagiaan yang aneh (di) awal senja pagi, (di) mencairnya salju musim semi, (di) semua yang binasa dan ada bijak.

Memilih baris yang berisi ekspresi

Ekspresi pencarian diapit oleh garis miring (/) dan ditempatkan sebelum perintah:

$ sed "/pagi/ s/in/(in)/i" gumilev.txt Betapa anehnya kebahagiaan (di) senja awal pagi, Dalam mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan bijaksana.

Memilih baris dalam rentang antara dua ekspresi

Seperti halnya nomor baris, rentang ditentukan dengan dipisahkan dengan koma:

$ sed "/morning/,/wise/ s/in/(in)/i" gumilev.txt Sungguh kebahagiaan yang aneh (di) awal senja, (di) mencairnya salju musim semi, (di) semuanya yang binasa dan bijaksana.

Memilih baris dari awal file hingga beberapa ekspresi

$ sed "1,/snow/ s/in/(in)/i" gumilev.txt Sungguh suatu kebahagiaan yang aneh (di) senja awal pagi, (dalam) mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan ada bijak.

Memilih baris dari beberapa ekspresi hingga akhir file

$ sed "/snow/,$ s/in/(in)/i" gumilev.txt Sungguh suatu kebahagiaan yang aneh Di awal senja, (dalam) mencairnya salju musim semi, (dalam) semua yang binasa dan ada bijak.

Perintah sed lainnya

perintah d (hapus)

Menghapus baris tertentu dari keluaran standar:

$ sed "2 d" gumilev.txt Sungguh suatu kebahagiaan yang aneh Dalam mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan bijaksana.

Dan lebih sering mereka menulis lebih mudah (tanpa spasi):

Sed "2d" gumilev.txt

Segala sesuatu yang dikatakan di bagian sebelumnya tentang pengalamatan baris berlaku untuk perintah d (seperti halnya pada hampir semua perintah editor sed).

Dengan menggunakan perintah d, akan lebih mudah untuk membuang "header" yang tidak perlu dari beberapa pesan email:

$ sed "1,/^$/ d" nama file

(Hapus baris dari baris pertama hingga baris kosong pertama).

Singkirkan komentar di file konfigurasi:

$ sed "/^#/d" /boot/grub/menu.lst

Dan Anda tidak pernah tahu di mana Anda perlu menghapus garis tambahan!

perintah p (cetak)

Kata bahasa Inggris "print" diterjemahkan sebagai "print", yang dalam bahasa Rusia dikaitkan dengan printer, atau setidaknya dengan keyboard. Padahal, dalam konteks bahasa Inggris, kata ini sering kali berarti keluaran ke layar monitor. Jadi perintah p tidak mencetak apa pun, hanya mencetak baris tertentu ke layar.

Digunakan dengan sendirinya, perintah p menggandakan baris dalam output (karena sed mencetak baris ke layar secara default, dan perintah p mencetak baris yang sama untuk kedua kalinya).

$gema saya punya kucing | sed "p" aku punya kucing aku punya kucing

Properti ini digunakan, misalnya, untuk menggandakan baris kosong guna menyempurnakan tampilan teks:

$ sed "/^$/ p nama file

Namun perintah p memperlihatkan wajah aslinya dalam kombinasi dengan opsi -n, yang, seperti yang Anda ingat, melarang keluaran garis ke layar. Dengan menggabungkan opsi -n dengan perintah p, Anda hanya bisa mendapatkan baris yang Anda butuhkan di output.

Misalnya, lihat baris satu sampai sepuluh:

$ sed -n "1,10 p" nama file

Atau sekedar berkomentar:

$ sed -n "/^#/ p" /boot/grub/menu.lst # File konfigurasi GRUB "/boot/grub/menu.lst". # dihasilkan oleh "grubconfig". Minggu 23 Mar 2008 21:45:41 # # Mulai bagian global GRUB # Akhiri bagian global GRUB # Konfigurasi partisi bootable Linux dimulai # Konfigurasi partisi bootable Linux berakhir # Konfigurasi partisi bootable Linux dimulai # Konfigurasi partisi bootable Linux berakhir

Yang sangat mirip dengan grep, yang telah kita temui ketika kita berbicara tentang opsi -n dengan pengubah /p. Namun, tidak seperti perintah grep, editor sed memungkinkan tidak hanya menemukan baris-baris ini, tetapi juga mengubahnya, mengganti, misalnya, Linux di mana pun dengan Unix:

$ sed -n "/^#/p" /boot/grub/menu.lst | sed "s/Linux/Unix/" # file konfigurasi GRUB "/boot/grub/menu.lst". # dihasilkan oleh "grubconfig". Minggu 23 Mar 2008 21:45:41 # # Mulai bagian global GRUB # Akhiri bagian global GRUB # Konfigurasi partisi bootable Unix dimulai # Konfigurasi partisi bootable Unix berakhir # Konfigurasi partisi bootable Unix dimulai # Konfigurasi partisi bootable Unix berakhir

Tim!

Terkadang Anda perlu mengedit semua baris kecuali yang cocok dengan POLA atau pilihan. Karakter tanda seru (!) membalikkan pilihan. Misalnya, mari kita hapus semua baris, kecuali baris kedua dari syair Gumilyov:

$ sed "2 !d" gumilev.txt Di awal senja,

Atau pilih semua baris kecuali komentar dari file /boot/grub/menu.lst:

$ sed -n "/^#/ !p" /boot/grub/menu.lst default 1 batas waktu 20 gfxmenu (hd0,3)/boot/judul pesan SuSe pada (/dev/hda3) root (hd0,2) kernel /boot/vmlinuz root=/dev/hda3 ro vga=773 acpi=off title Linux aktif (/dev/hda4) root (hd0,3) kernel /boot/vmlinuz root=/dev/hda4 ro vga=0x317

perintah q (keluar)

Perintah q menghentikan program sed setelah baris yang ditentukan. Ini berguna jika Anda ingin berhenti mengedit setelah mencapai titik tertentu dalam teks:

$ sed "11 q" nama file

Perintah ini akan selesai bekerja saat mencapai baris ke-11.

Perintah q adalah salah satu dari sedikit perintah sed yang tidak menerima rentang baris. Tim tidak dapat berhenti bekerja 10 kali berturut-turut jika kita memasukkan:

Sed "1.10q" Tidak masuk akal!

w (tulis) perintah

Seperti pengubah w pada perintah s, perintah ini memungkinkan Anda untuk menulis output suatu program ke file:

$ sed -n "3,$w permen karet.txt" gumilev.txt

Kita akan mendapatkan file gum.txt yang berisi dua baris terakhir syair Gumilev dari file gumilev.txt. Apalagi jika file tersebut sudah ada, maka akan ditimpa. Jika Anda tidak memasukkan opsi -n, maka program selain membuat file gum.txt, juga akan menampilkan seluruh isi file gumilev.txt di layar.

Untuk bekerja pada baris perintah, akan lebih mudah menggunakan pengalihan keluaran normal (> atau >>), tetapi dalam skrip sed, perintah w mungkin akan berguna.

perintah r (baca)

Perintah ini tidak hanya akan membaca file yang ditentukan, tetapi juga memasukkan isinya ke lokasi yang diinginkan pada file yang sedang diedit. Untuk memilih pengalamatan "tempat yang diperlukan" sudah tidak asing lagi bagi kita (berdasarkan nomor baris, berdasarkan ekspresi, dll.). Contoh:

$ echo Dari puisi Gumilev: | sed "rgumilev.txt"

Dari puisi karya Gumilyov:

Sungguh suatu kebahagiaan yang aneh Di awal senja, Dalam mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan bijaksana.

Perintah =

Memberikan nomor baris yang ditentukan:

$ sed "/snow/=" gumilev.txt Sungguh suatu kebahagiaan yang aneh Di awal senja, 3 Dalam mencairnya salju musim semi, Dalam segala sesuatu yang binasa dan bijaksana.

$ sed -n "/snow/=" gumilev.txt 3

Perintah hanya menerima satu alamat, tidak menerima interval.

Tim y

Perintah ini menggantikan karakter di bagian POLA dengan karakter di bagian REPLACE, bekerja seperti sebuah program tr.

$ echo Mobil - warisan masa lalu | sed "y/Auto/Paro/" Paromobile - warisan masa lalu

Tim y hanya berfungsi jika jumlah karakter di POLA sama dengan jumlah karakter di REPLACE.

skrip program sed

Untuk menggunakan sed sebagai editor teks lengkap, Anda perlu mempelajari cara menulis skrip sed. Program sed memiliki bahasa pemrograman sederhana yang memungkinkan Anda menulis skrip yang dapat melakukan keajaiban.

Artikel ini tidak boleh memuat deskripsi skrip sed, dan penulisnya juga tidak menetapkan tugas untuk menguasai bahasa pemrograman sed. Pada artikel ini, saya fokus menggunakan editor sed pada baris perintah, dengan fokus menggunakannya sebagai filter dalam pipa. Karena alasan ini, saya telah menghilangkan banyak perintah sed yang hanya digunakan dalam skripnya.

Ada banyak penggemar editor sed, dan banyak artikel tentang topik scripting, termasuk di Runet. Jadi bagi mereka yang tertarik dengan program luar biasa ini, tidak akan sulit untuk menambah pengetahuannya.

Program sed dan karakter Sirilik

Seperti yang dapat Anda lihat dari contoh di artikel ini, program sed pada sistem Russified yang benar fasih dalam bahasa "hebat dan perkasa".

Ringkasan program sed

Program sed adalah editor aliran data multifungsi, sangat diperlukan untuk:

  • Mengedit array teks besar
  • Mengedit file dengan ukuran berapa pun ketika urutan langkah pengeditan terlalu rumit
  • Mengedit data saat tersedia, termasuk secara real time - yaitu, jika sulit atau tidak mungkin menggunakan editor teks interaktif.

Diperlukan waktu berminggu-minggu atau bahkan berbulan-bulan untuk menguasai sepenuhnya program sed, karena ini memerlukan:

  • Pelajari ekspresi reguler
  • Pelajari cara menulis skrip sed dengan mempelajari bahasa pemrograman sederhana yang digunakan dalam skrip ini

Di sisi lain, beberapa perintah sed yang paling umum mudah dikuasai seperti perintah Unix lainnya; Saya harap artikel ini akan membantu Anda dalam hal ini.

Kata penutup

Sejauh ini, dalam artikel seri HuMan, saya telah mencoba setidaknya mengungkap secara singkat setiap opsi, setiap parameter dari perintah yang dijelaskan, sehingga artikel tersebut dapat menggantikan mana. Kedepannya, saya akan terus berpegang pada prinsip ini.

Artikel ini merupakan pengecualian, karena tidak menjelaskan semua fitur program. Untuk mendeskripsikannya secara lengkap, dibutuhkan bukan sebuah artikel, melainkan sebuah buku. Namun, artikel ini memungkinkan Anda mendapatkan gambaran tentang editor sed dan memulai program luar biasa ini menggunakan perintah yang paling umum.

Sed adalah alat pengolah teks yang ringan (biner hanya berbobot 128 kilobyte) dan mudah digunakan.

Pada artikel ini, saya akan memberikan beberapa contoh sederhana cara penggunaannya sed dan berbicara tentang fitur utamanya.

Sed mengambil aliran input atau file baris demi baris, mengedit setiap baris sesuai dengan aturan yang ditentukan dalam skrip sed, dan kemudian mencetak hasilnya. Sed adalah bahasa pemrograman lengkap Turing.

format perintah sed

Perintah sed memiliki format:

sed [ -n ] [ -e skrip ] [ -f file skrip ] [ file ]

Bendera -N menekan keluaran
-e- menunjuk ke daftar instruksi yang diberikan pada baris perintah.
-F- menunjukkan lokasi file skrip.

Edit Format Perintah

File skrip terdiri dari serangkaian perintah:

[ alamat [ , alamat ] ] perintah [ argumen ]

satu per baris.
Alamat berupa nomor baris, atau karakter khusus, atau ekspresi reguler:

$ - baris terakhir
mulai~N- Setiap N-baris ke-th, dimulai dengan angka Awal
/ekspresi reguler/- string yang cocok dengan ekspresi_reguler
Contoh:

1~2 - Setiap baris kedua /REGEXP/- semua baris mengandung /REGEXP/ 10,20 - baris dari tanggal 10 hingga 20 10,+10 - baris dari tanggal 10 hingga 20 5~N- garis mulai dari tanggal 5 sampai dengan yang pertama, kelipatan N 5, /REGEXP/- baris berisi /REGEXP/, setelah tanggal 5 (tidak termasuk tanggal 5)
  • Jika alamat tidak ditentukan, semua baris diproses.
  • Jika satu alamat ditentukan, baris terkait akan diproses
  • Jika dua alamat ditentukan, maka baris dalam interval tertentu akan dipilih.
  • !tim- dilakukan tim, untuk baris yang tidak dipilih berdasarkan alamat.

Perintah dasar

Pertimbangkan perintah dasar:

[alamat] sebuah teks- tambahkan baris baru dengan teks setelah baris yang ditentukan

$ kucing sed_test sed_test_1 11111 sed_test_2 22222 sed_test_3 33333 $ sed -e "2 baris baru" sed_test sed_test_1 11111 sed_test_2 22222 baris_baru sed_test_3 33333

[alamat [, alamat]] c teks- Menghapus baris yang dipilih dan menggantinya dengan teks

$ sed -e "2 dengan baris_baru" sed_test sed_test_1 11111 baris_baru sed_test_3 33333 $ sed -e "/3/ dengan baris_baru" sed_test sed_test_1 11111 sed_test_2 22222 baris_baru

[alamat [, alamat]] d- Menghapus baris yang ditentukan.

$ sed -e "2 hari" sed_test sed_test_1 11111 sed_test_3 33333 $ sed -e "2!d" sed_test sed_test_2 22222

[alamat] aku mengirim pesan- Menyisipkan teks di tempat garis yang ditentukan.

$ sed -e "2 saya baris_baru" sed_test sed_test_1 11111 teks_baru sed_test_2 22222 sed_test_3 33333

[alamat [, alamat]] hal(dengan bendera -N) mencetak garis yang ditemukan.

$ sed -ne "2p" sed_test sed_test_2 22222

[alamat] q- keluar dari sed.

[alamat [, alamat]] file r- Sedang membaca mengajukan dan mengeluarkan isinya.

[alamat [, alamat]] s/regex/penggantian/bendera- Menggantikan ekspresi reguler pada penggantian-y dengan bendera:

  • g - di seluruh baris
  • i - tidak peka huruf besar-kecil
  • p - menampilkan hasil penggantian
$ sed -ne "s/t/T/g" sed_test sed_TesT_1 11111 sed_TesT_2 22222 sed_TesT_3 33333 $ sed -e "s//d/g" sed_test sed_test_d ddddd sed_test_d ddddd sed_test_d ddddd

[alamat[, alamat]] y/line1/line2/- Mengganti semua kemunculan karakter di baris1 karakter yang sesuai dari garis2. Panjang string harus sama.

$ sed -ne "y/est/EST/g" sed_test SEd_TEST_1 11111 SEd_TEST_2 22222 SEd_TEST_3 33333

[alamat[, alamat]] (perintah)- perintah grup tanda kurung
[alamat] =- Memberikan nomor baris

Tag

: label- memetakan ke sekelompok perintah label
b label label, Jika label hilang, lalu lanjutkan ke akhir file batch.

tidak menandai- lompat ke perintah yang ditunjukkan oleh label label hanya setelah penggantian berhasil menggunakan perintah S///

Jalankan putaran

sed bekerja dengan dua buffer data: utama dan tambahan. Kedua buffer awalnya kosong.
Pengerjaan dengan buffer ini dilakukan dengan menggunakan perintah:\\`h', `H', `x', `g', `G' `D' H- Ganti isi buffer tambahan dengan isi buffer utama
H- Tambahkan baris baru ke buffer tambahan dan kemudian tambahkan konten buffer utama ke konten tambahan
X- Tukar isi kedua buffer
G- Ganti isi buffer utama dengan isi buffer tambahan
G- Tambahkan baris baru ke buffer utama lalu tambahkan konten buffer tambahan ke konten utama
D- Hapus teks buffer utama hingga karakter baris baru berikutnya
N- Tambahkan baris baru ke buffer utama, lalu tambahkan baris berikutnya untuk diproses di sana
P- Keluarkan isi buffer utama hingga karakter baris baru berikutnya.

Contoh yang lebih kompleks

Skrip berikut menukar baris file (baris pertama menjadi baris terakhir dan sebaliknya)

$ cat tac.sed #!/usr/bin/sed -nf # dimulai pada baris kedua, isi buffer (yang sudah berisi # semua baris sebelumnya) ditambahkan ke baris saat ini. 1! G# ketika baris terakhir tercapai, cetak $p# Buffer lagi h sed -nf tac.sed sed_test sed_test_3 33333 sed_test_2 22222 sed_test_1 11111

Membaca baris-baris file (menampilkan nomor baris terakhir)

$ jumlah kucing.sed #!/usr/bin/sed -nf $=

hasil

$ sed -nf hitungan.sed sed_test 3

Pembalikan string

$ cat revers.sed #!/usr/bin/sed -f # lewati baris satu huruf /../! b# Membalikkan senarnya. Tambahkan baris kosong sebelum dan sesudah baris saat ini. s/%$@~*!G4;:%#`.*$/\ &\ / # Pindahkan karakter pertama ke akhir # loop berjalan selama masih ada karakter di garis tengah. tx:x s/\(\\n.\)\(.*\)\(.\\n\)/\\3\\2\\1/ tx #hapus jeda baris tambahan s/\\n// G

Skrip ini memindahkan dua huruf sekaligus.

$ sed -f membalikkan.sed sed_test 11111 1_tset_des 22222 2_tset_des 33333 3_tset_des

informasi tambahan

Anda dapat mempelajari lebih lanjut tentang format skrip sed dengan membaca manualnya pria sed atau dokumentasi teknis informasi sed.