Artikel ini adalah bagian dari seri Tip dan Trik Unix Sed yang sedang berlangsung.
Dalam artikel sed kami sebelumnya, kami mempelajari — pencetakan sed, penghapusan sed, penggantian sed , penulisan file sed, dan beberapa perintah sed.
Dalam artikel ini, mari kita tinjau beberapa solusi menarik dengan perintah pengganti “s” di sed dengan beberapa contoh praktis.
Aku. Pembatas Pergantian Sed
Seperti yang kita bahas di posting sebelumnya, kita dapat menggunakan pembatas yang berbeda seperti @ % |; :dalam perintah pengganti sed.
Mari kita buat file path.txt terlebih dahulu yang akan digunakan dalam semua contoh yang disebutkan di bawah ini.
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Contoh 1 – sed @ pembatas:Ganti /opt/omni/lbin ke /opt/tools/bin
Saat Anda mengganti nama jalur yang memiliki '/', Anda dapat menggunakan @ sebagai pembatas alih-alih '/'. Pada contoh sed di bawah ini, di baris terakhir file input, /opt/omni/lbin diubah menjadi /opt/tools/bin.
$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
Contoh 2 – sed / pembatas:Ganti /opt/omni/lbin ke /opt/tools/bin
Ketika Anda harus menggunakan '/' dalam substitusi terkait nama jalur, Anda harus menghindari '/' dalam data substitusi seperti yang ditunjukkan di bawah ini. Dalam contoh sed ini, pembatas '/' diloloskan di bagian REGEXP dan REPLACEMENT.
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed '&' Dapatkan String yang Cocok
Bagian tepat dari baris input yang cocok dengan Ekspresi Reguler diwakili oleh &, yang kemudian dapat digunakan di bagian pengganti.
Contoh 1 – sed &Penggunaan:Ganti /usr/bin/ ke /usr/bin/local
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Pada contoh di atas '&' di bagian pengganti akan diganti dengan /usr/bin yang cocok dengan pola dan menambahkannya dengan /local. Jadi di output semua kemunculan /usr/bin akan diganti dengan /usr/bin/local
Contoh 2 – sed &Penggunaan:Cocokkan seluruh baris
&mengganti apa pun yang cocok dengan REGEXP yang diberikan.
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
Dalam contoh di atas regexp memiliki “^.*$” yang cocok dengan seluruh baris. Bagian pengganti <<<&>>> menulis seluruh baris dengan <<
III. Pengelompokan dan Referensi Kembali di Sed
Pengelompokan dapat digunakan dalam sed seperti ekspresi reguler normal. Grup dibuka dengan “\(” dan ditutup dengan “\)”. Pengelompokan dapat digunakan dalam kombinasi dengan referensi balik.
Referensi balik adalah penggunaan kembali bagian dari Ekspresi Reguler yang dipilih dengan pengelompokan. Referensi-balik di sed dapat digunakan baik dalam Ekspresi Reguler maupun di bagian pengganti dari perintah pengganti.
Contoh 1:Dapatkan hanya jalur pertama di setiap baris
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
Dalam contoh di atas, \(\/[^:]*\) cocok dengan jalur yang tersedia sebelum first :datang. \1 menggantikan grup pertama yang cocok.
Contoh 2:Multigrouping
Di file path.txt ubah urutan bidang di baris terakhir file.
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
Pada perintah di atas $ menentukan substitusi yang terjadi hanya untuk baris terakhir. Output menunjukkan bahwa urutan nilai jalur di baris terakhir telah dibalik.
Contoh 3:Dapatkan daftar nama pengguna di file /etc/passwd
Contoh sed ini hanya menampilkan bidang pertama dari file /etc/passwd.
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
Contoh 4:Tanda kurung karakter pertama setiap kata
Contoh sed ini mencetak karakter pertama dari setiap kata dalam tanda kurung.
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
Contoh 5:Buat bilangan sederhana.
Mari kita buat file bernama angka yang memiliki daftar angka. Contoh perintah sed di bawah ini digunakan untuk mengomifikasi angka hingga ribuan.
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123