Editor Aliran - String

Perintah Pengganti

Operasi substitusi teks seperti "temukan dan ganti" biasa terjadi di editor teks mana pun. Di bagian ini, kami mengilustrasikan bagaimana SED melakukan substitusi teks. Diberikan di bawah ini adalah sintaks dari perintah substitusi.

[address1[,address2]]s/pattern/replacement/[flags]

Sini, address1 dan address2adalah alamat awal dan akhir masing-masing, yang bisa berupa nomor baris atau string pola. Kedua alamat ini adalah parameter opsional. Pola adalah teks yang ingin kita ganti dengan string pengganti. Selain itu, kami dapat menentukan flag opsional dengan SED.

Di file books.txt, kami telah menggunakan koma (,) untuk memisahkan setiap kolom. Mari kita gunakan batang vertikal (|) untuk memisahkan setiap kolom. Untuk melakukan ini, ganti koma (,) dengan bilah vertikal (|).

[jerry]$ sed 's/,/ | /' books.txt

Saat menjalankan kode di atas, Anda mendapatkan 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

Jika Anda mengamati dengan cermat, hanya koma pertama yang diganti dan yang kedua tetap apa adanya. Mengapa? Segera setelah polanya cocok, SED menggantinya dengan string pengganti dan berpindah ke baris berikutnya. Secara default, ini hanya menggantikan kejadian pertama. Untuk mengganti semua kejadian, gunakan bendera global (g) dengan SED sebagai berikut:

[jerry]$ sed 's/,/ | /g' books.txt

Saat menjalankan kode di atas, Anda mendapatkan 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

Sekarang semua kemunculan koma (,) diganti dengan bar vertikal (|).

Kita dapat menginstruksikan SED untuk melakukan substitusi teks hanya jika pencocokan pola berhasil. Contoh berikut menggantikan koma (,) dengan bar vertikal (|) hanya jika sebuah garis berisi pola The Pilgrimage.

[jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt

Saat menjalankan kode di atas, Anda mendapatkan 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

Selain itu, SED dapat menggantikan kemunculan pola tertentu. Mari kita ganti hanya contoh kedua dari koma (,) dengan batang vertikal (|).

[jerry]$ sed 's/,/ | /2' books.txt

Saat menjalankan kode di atas, Anda mendapatkan 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

Dalam contoh di atas, angka di akhir perintah SED (atau di tempat bendera) menunjukkan kejadian ke-2.

SED menyediakan fitur yang menarik. Setelah melakukan substitusi, SED memberikan opsi untuk hanya menampilkan baris yang diubah. Untuk tujuan ini, SED menggunakanpbendera yang mengacu pada cetakan. Contoh berikut hanya mencantumkan baris yang diubah.

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

Kita juga dapat menyimpan baris yang diubah di file lain. Untuk mencapai hasil ini, gunakanwbendera. Contoh berikut menunjukkan bagaimana melakukannya.

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

Kami menggunakan perintah SED yang sama. Biarkan kami memverifikasi konten filejunk.txt mengajukan.

[jerry]$ cat junk.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

Untuk melakukan substitusi case-insensitive, gunakan flag i yang mengimplikasikan abaikan case. Contoh berikut menjalankan substitusi tidak peka huruf besar / kecil.

[jerry]$ sed  -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

Sejauh ini, kita hanya menggunakan karakter foreslash (/) sebagai pembatas, tetapi kita juga dapat menggunakan bar vertikal (|), pada tanda (@), caret (^), tanda seru (!) Sebagai pembatas. Contoh berikut menunjukkan cara menggunakan karakter lain sebagai pembatas.

Mari kita asumsikan Anda perlu mengganti jalur /bin/sed dengan /home/jerry/src/sed/sed-4.2.2/sed. Karenanya, perintah SED Anda terlihat seperti ini:

[jerry]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/jerry\/src\/sed\/sed-4.2.2\/sed/'

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

/home/jerry/src/sed/sed-4.2.2/sed

Kita bisa membuat perintah ini lebih mudah dibaca dan dimengerti. Mari kita gunakan batang vertikal (|) sebagai pembatas dan lihat hasilnya.

[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

/home/jerry/src/sed/sed-4.2.2/sed

Memang! Kami mendapatkan hasil yang sama dan sintaksnya lebih mudah dibaca. Demikian pula, kita dapat menggunakan tanda "at" (@) sebagai pemisah sebagai berikut:

[jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

/home/jerry/src/sed/sed-4.2.2/sed

Selain itu, kita dapat menggunakan tanda sisipan (^) sebagai pembatas.

[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

/home/jerry/src/sed/sed-4.2.2/sed

Kita juga bisa menggunakan tanda seru (!) Sebagai pembatas sebagai berikut:

[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

/home/jerry/src/sed/sed-4.2.2/sed

Umumnya, garis miring terbalik (/) digunakan sebagai pembatas tetapi terkadang lebih nyaman menggunakan pembatas lain yang didukung dengan SED.

Membuat Substring

Kami mempelajari perintah pengganti yang kuat. Mari kita lihat apakah kita dapat menemukan substring dari teks yang cocok. Mari kita pahami bagaimana melakukannya dengan bantuan contoh.

Mari kita perhatikan teks berikut:

[jerry]$ echo "Three One Two"

Misalkan kita harus menyusunnya menjadi sebuah urutan. Berarti, itu harus mencetak Satu dulu, lalu Dua, dan akhirnya Tiga. Satu baris berikut melakukan yang diperlukan.

echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

Perhatikan bahwa dalam contoh di atas, batang vertikal (|) digunakan sebagai pemisah.

Dalam SED, substring dapat ditentukan dengan menggunakan operator pengelompokan dan harus diawali dengan karakter escape, yaitu, \( dan \).

\wadalah ekspresi reguler yang cocok dengan huruf, angka, atau garis bawah dan "+" digunakan untuk mencocokkan lebih dari satu karakter. Dengan kata lain, ekspresi reguler\(\w\+\) cocok dengan satu kata dari string input.

Dalam string input, ada tiga kata yang dipisahkan oleh spasi, jadi ada threeekspresi reguler dipisahkan oleh spasi. Ekspresi reguler pertama menyimpan kata pertama, yaitu Tiga, yang kedua menyimpan kataOne, dan yang ketiga menyimpan kata Two

Substring ini dirujuk oleh \N,dengan N adalah nomor substring. Karenanya,\2 mencetak substring kedua, yaitu One; \3 mencetak substring ketiga, yaitu Two; dan \1 mencetak substring pertama, yaitu Three

Mari kita pisahkan kata-kata ini dengan koma (,) dan modifikasi ekspresi reguler yang sesuai.

[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

One,Two,Three

Perhatikan bahwa sekarang ada koma (,) sebagai ganti spasi dalam ekspresi reguler.

Bendera Penggantian String (khusus GNU SED)

Di bagian sebelumnya, kami melihat beberapa contoh perintah substitusi. GNU SED menyediakan beberapa urutan escape khusus yang dapat digunakan dalam string pengganti. Perhatikan bahwa flag pengganti string ini khusus untuk GNU dan mungkin tidak berfungsi dengan varian SED lainnya. Disini kita akan membahas flag pengganti string.

  • \ L: Ketika \ L ditentukan dalam string pengganti, itu memperlakukan semua karakter yang tersisa dari kata setelah \ L sebagai karakter huruf kecil. Misalnya, karakter "ULO" diperlakukan sebagai karakter huruf kecil.

[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288
  • \ u: Ketika \ u ditentukan dalam string pengganti, itu memperlakukan karakter langsung setelah \ u sebagai karakter huruf besar. Dalam contoh berikut, \ u digunakan sebelum karakter 'a' dan 'o'. Karenanya SED memperlakukan karakter ini sebagai huruf besar.

[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, pAulO Coelho, 197 
5) The Pilgrimage, pAulO Coelho, 288
  • \ U: Ketika \ U ditentukan dalam string pengganti, itu memperlakukan semua karakter yang tersisa dari kata setelah \ U sebagai karakter huruf besar.

[jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, PAULO Coelho, 197 
5) The Pilgrimage, PAULO Coelho, 288
  • \ E: Bendera ini harus digunakan dengan \ L atau \ U. Ini menghentikan konversi yang dimulai oleh bendera \ L atau \ U. Dalam contoh berikut, hanya kata pertama yang diganti dengan huruf besar.

[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt

Saat menjalankan kode di atas, Anda mendapatkan hasil sebagai berikut:

3) The Alchemist, PAULO coelho, 197 
5) The Pilgrimage, PAULO coelho, 288