Unix / Linux - Ekspresi Reguler dengan SED
Pada bab ini, kita akan membahas secara detail tentang ekspresi reguler dengan SED di Unix.
Ekspresi reguler adalah string yang dapat digunakan untuk menggambarkan beberapa urutan karakter. Ekspresi reguler digunakan oleh beberapa perintah Unix yang berbeda, termasuked, sed, awk, grep, dan pada tingkat yang lebih terbatas, vi.
Sini SED berdiri untuk stream editor. Editor berorientasi aliran ini dibuat secara eksklusif untuk menjalankan skrip. Jadi, semua masukan yang Anda masukkan ke dalamnya melewati dan menuju ke STDOUT dan itu tidak mengubah file masukan.
Memanggil sed
Sebelum kita mulai, mari kita pastikan kita memiliki salinan lokal /etc/passwd file teks untuk dikerjakan sed.
Seperti disebutkan sebelumnya, sed dapat dipanggil dengan mengirimkan data melalui pipa ke sana sebagai berikut -
$ cat /etc/passwd | sed
Usage: sed [OPTION]... {script-other-script} [input-file]...
-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression = script
...............................
Itu cat perintah membuang konten /etc/passwd untuk sedmelalui pipa ke dalam ruang pola sed. Ruang pola adalah buffer kerja internal yang digunakan sed untuk operasinya.
Sintaks Umum sed
Berikut ini adalah sintaks umum untuk sed -
/pattern/action
Sini, pattern adalah ekspresi reguler, dan actionadalah salah satu perintah yang diberikan dalam tabel berikut. Jikapattern dihilangkan, action dilakukan untuk setiap baris seperti yang telah kita lihat di atas.
Karakter garis miring (/) yang mengelilingi pola diperlukan karena digunakan sebagai pembatas.
Sr.No. | Rentang & Deskripsi |
---|---|
1 | p Mencetak garis |
2 | d Menghapus garis |
3 | s/pattern1/pattern2/ Gantikan kemunculan pertama pola1 dengan pola2 |
Menghapus Semua Baris dengan sed
Kami sekarang akan memahami cara menghapus semua baris dengan sed. Panggil sed lagi; tapi sed sekarang seharusnya menggunakanediting command delete line, dilambangkan dengan satu huruf d -
$ cat /etc/passwd | sed 'd'
$
Alih-alih memanggil sed dengan mengirimkan file ke dalamnya melalui pipa, sed dapat diinstruksikan untuk membaca data dari file, seperti pada contoh berikut.
Perintah berikut melakukan hal yang persis sama seperti pada contoh sebelumnya, tanpa perintah cat -
$ sed -e 'd' /etc/passwd
$
Alamat sed
Sed juga mendukung alamat. Alamat adalah lokasi tertentu dalam file atau rentang tempat perintah pengeditan tertentu harus diterapkan. Ketika sed tidak menemukan alamat, ia melakukan operasinya pada setiap baris dalam file.
Perintah berikut menambahkan alamat dasar ke perintah sed yang telah Anda gunakan -
$ cat /etc/passwd | sed '1d' |more
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$
Perhatikan bahwa angka 1 ditambahkan sebelum delete editperintah. Ini menginstruksikan sed untuk melakukan perintah pengeditan pada baris pertama file. Dalam contoh ini, sed akan menghapus baris pertama/etc/password dan mencetak sisa file.
Rentang Alamat sed
Kami sekarang akan memahami cara bekerja dengan the sed address ranges. Jadi bagaimana jika Anda ingin menghapus lebih dari satu baris dari sebuah file? Anda dapat menentukan rentang alamat dengan sed sebagai berikut -
$ cat /etc/passwd | sed '1, 5d' |more
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$
Perintah di atas akan diterapkan pada semua baris mulai dari 1 hingga 5. Ini menghapus lima baris pertama.
Coba rentang alamat berikut -
Sr.No. | Rentang & Deskripsi |
---|---|
1 | '4,10d' Garis mulai dari 4 th sampai 10 th dihapus |
2 | '10,4d' Hanya baris ke- 10 yang dihapus, karena sed tidak bekerja pada arah sebaliknya |
3 | '4,+5d' Ini cocok dengan baris 4 di file, menghapus baris itu, terus menghapus lima baris berikutnya, dan kemudian menghentikan penghapusannya dan mencetak sisanya |
4 | '2,5!d' Ini menghapus semuanya kecuali mulai dari 2 nd sampai 5 th baris |
5 | '1~3d' Ini menghapus baris pertama, melewati tiga baris berikutnya, dan kemudian menghapus baris keempat. Sed terus menerapkan pola ini hingga akhir file. |
6 | '2~2d' Ini memberitahu sed untuk menghapus baris kedua, melangkahi baris berikutnya, menghapus baris berikutnya, dan ulangi sampai akhir file tercapai. |
7 | '4,10p' Garis mulai dari 4 th sampai 10 th dicetak |
8 | '4,d' Ini menghasilkan kesalahan sintaks |
9 | ',10d' Ini juga akan menghasilkan kesalahan sintaks |
Note - Saat menggunakan p tindakan, Anda harus menggunakan -npilihan untuk menghindari pengulangan pencetakan garis. Periksa perbedaan antara dua perintah berikut -
$ cat /etc/passwd | sed -n '1,3p'
Check the above command without -n as follows −
$ cat /etc/passwd | sed '1,3p'
Perintah Substitusi
Perintah substitusi, dilambangkan dengan s, akan menggantikan string apa pun yang Anda tentukan dengan string lain yang Anda tentukan.
Untuk mengganti satu string dengan yang lain, sed perlu memiliki informasi di mana string pertama berakhir dan string substitusi dimulai. Untuk ini, kami melanjutkan dengan memesan dua string dengan garis miring (/) karakter.
Perintah berikut menggantikan kemunculan pertama pada baris string root dengan benang amrood.
$ cat /etc/passwd | sed 's/root/amrood/'
amrood:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
..........................
Sangat penting untuk dicatat bahwa sed hanya menggantikan kejadian pertama pada sebuah baris. Jika akar string muncul lebih dari sekali dalam satu baris, hanya kecocokan pertama yang akan diganti.
Agar sed melakukan substitusi global, tambahkan huruf tersebut g ke akhir perintah sebagai berikut -
$ cat /etc/passwd | sed 's/root/amrood/g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
...........................
Bendera Substitusi
Ada sejumlah flag berguna lainnya yang bisa diteruskan selain g bendera, dan Anda dapat menentukan lebih dari satu pada satu waktu.
Sr.No. | Bendera & Deskripsi |
---|---|
1 | g Mengganti semua pertandingan, bukan hanya pertandingan pertama |
2 | NUMBER Hanya menggantikan pertandingan ke- NUMBER |
3 | p Jika dilakukan substitusi, maka pola ruang dicetak |
4 | w FILENAME Jika substitusi dibuat, maka tulis hasilnya ke FILENAME |
5 | I or i Cocok dengan cara tidak peka huruf besar / kecil |
6 | M or m Selain perilaku normal karakter ekspresi reguler khusus ^ dan $, tanda ini menyebabkan ^ mencocokkan string kosong setelah baris baru dan $ mencocokkan string kosong sebelum baris baru |
Menggunakan Pemisah String Alternatif
Misalkan Anda harus melakukan substitusi pada string yang menyertakan karakter garis miring. Dalam kasus ini, Anda dapat menentukan pemisah yang berbeda dengan memberikan karakter yang ditentukan setelahs.
$ cat /etc/passwd | sed 's:/root:/amrood:g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
Dalam contoh di atas, kami telah menggunakan : sebagai delimiter alih-alih garis miring / karena kami mencoba menelusuri /root alih-alih root sederhana.
Mengganti dengan Empty Space
Gunakan string substitusi kosong untuk menghapus string root dari /etc/passwd file seluruhnya -
$ cat /etc/passwd | sed 's/root//g'
:x:0:0::/:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
Pergantian Alamat
Jika Anda ingin mengganti string sh dengan benang quiet hanya di baris 10, Anda dapat menentukannya sebagai berikut -
$ cat /etc/passwd | sed '10s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/quiet
Demikian pula, untuk melakukan substitusi rentang alamat, Anda dapat melakukan sesuatu seperti berikut -
$ cat /etc/passwd | sed '1,5s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/quiet
daemon:x:1:1:daemon:/usr/sbin:/bin/quiet
bin:x:2:2:bin:/bin:/bin/quiet
sys:x:3:3:sys:/dev:/bin/quiet
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
Seperti yang Anda lihat dari output, lima baris pertama memiliki string sh diubah menjadi quiet, tapi garis lainnya tidak tersentuh.
Perintah Pencocokan
Anda akan menggunakan p opsi bersama dengan -n pilihan untuk mencetak semua baris yang cocok sebagai berikut -
$ cat testing | sed -n '/root/p'
root:x:0:0:root user:/root:/bin/sh
[root@ip-72-167-112-17 amrood]# vi testing
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
Menggunakan Ekspresi Reguler
Saat mencocokkan pola, Anda dapat menggunakan ekspresi reguler yang memberikan lebih banyak fleksibilitas.
Periksa contoh berikut yang cocok dengan semua baris yang dimulai dengan daemon dan kemudian menghapusnya -
$ cat testing | sed '/^daemon/d'
root:x:0:0:root user:/root:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
Berikut adalah contoh yang menghapus semua baris yang diakhiri dengan sh -
$ cat testing | sed '/sh$/d'
sync:x:4:65534:sync:/bin:/bin/sync
Tabel berikut mencantumkan empat karakter khusus yang sangat berguna dalam ekspresi reguler.
Sr.No. | Deskripsi karakter |
---|---|
1 | ^ Cocok dengan awal baris |
2 | $ Cocok dengan akhir baris |
3 | . Cocok dengan salah satu karakter |
4 | * Mencocokkan nol atau lebih kemunculan karakter sebelumnya |
5 | [chars] Cocok dengan salah satu karakter yang diberikan dalam karakter, di mana karakter adalah urutan karakter. Anda dapat menggunakan - karakter untuk menunjukkan serangkaian karakter. |
Karakter yang Cocok
Lihat beberapa ekspresi lagi untuk diperagakan penggunaannya metacharacters. Misalnya, pola berikut -
Sr.No. | Ekspresi & Deskripsi |
---|---|
1 | /a.c/ Cocok dengan baris yang berisi string seperti a+c, a-c, abc, match, dan a3c |
2 | /a*c/ Cocok dengan string yang sama bersama dengan string seperti ace, yacc, dan arctic |
3 | /[tT]he/ Cocok dengan string The dan the |
4 | /^$/ Cocok dengan baris kosong |
5 | /^.*$/ Mencocokkan seluruh baris apa pun itu |
6 | / */ Cocok dengan satu atau lebih spasi |
7 | /^$/ Cocok blank garis |
Tabel berikut menunjukkan beberapa set karakter yang sering digunakan -
Sr.No. | Set & Deskripsi |
---|---|
1 | [a-z] Cocok dengan satu huruf kecil |
2 | [A-Z] Cocok dengan satu huruf besar |
3 | [a-zA-Z] Cocok dengan satu huruf |
4 | [0-9] Cocok dengan satu nomor |
5 | [a-zA-Z0-9] Cocok dengan satu huruf atau angka |
Kata Kunci Kelas Karakter
Beberapa kata kunci khusus biasanya tersedia untuk regexps, terutama utilitas GNU yang menggunakan regexps. Ini sangat berguna untuk ekspresi reguler sed karena mereka menyederhanakan dan meningkatkan keterbacaan.
Misalnya karakter a through z dan karakternya A through Z, Merupakan salah satu kelas karakter yang memiliki kata kunci [[:alpha:]]
Menggunakan kata kunci kelas karakter alfabet, perintah ini hanya mencetak baris di /etc/syslog.conf file yang dimulai dengan huruf alfabet -
$ cat /etc/syslog.conf | sed -n '/^[[:alpha:]]/p'
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
Tabel berikut adalah daftar lengkap dari kata kunci kelas karakter yang tersedia di GNU sed.
Sr.No. | Kelas Karakter & Deskripsi |
---|---|
1 | [[:alnum:]] Alfanumerik [az AZ 0-9] |
2 | [[:alpha:]] Alfabet [az AZ] |
3 | [[:blank:]] Karakter kosong (spasi atau tab) |
4 | [[:cntrl:]] Kontrol karakter |
5 | [[:digit:]] Angka [0-9] |
6 | [[:graph:]] Semua karakter yang terlihat (tidak termasuk spasi) |
7 | [[:lower:]] Huruf kecil [az] |
8 | [[:print:]] Karakter yang dapat dicetak (karakter non-kontrol) |
9 | [[:punct:]] Karakter tanda baca |
10 | [[:space:]] Spasi Putih |
11 | [[:upper:]] Huruf besar [AZ] |
12 | [[:xdigit:]] Digit hex [0-9 af AF] |
Aampersand Referensi
Itu sed metacharacter &mewakili isi pola yang cocok. Misalnya, Anda memiliki file bernamaphone.txt penuh dengan nomor telepon, seperti berikut -
5555551212
5555551213
5555551214
6665551215
6665551216
7775551217
Anda ingin membuat file area code(tiga digit pertama) diapit tanda kurung agar lebih mudah dibaca. Untuk melakukan ini, Anda dapat menggunakan karakter pengganti ampersand -
$ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt
(555)5551212
(555)5551213
(555)5551214
(666)5551215
(666)5551216
(777)5551217
Di sini, di bagian pola Anda mencocokkan 3 digit pertama dan kemudian menggunakan & Anda mengganti 3 digit itu dengan sekitarnya parentheses.
Menggunakan Beberapa Perintah sed
Anda dapat menggunakan beberapa perintah sed dalam satu perintah sed sebagai berikut -
$ sed -e 'command1' -e 'command2' ... -e 'commandN' files
Sini command1 melalui commandNadalah perintah sed dari tipe yang dibahas sebelumnya. Perintah ini diterapkan ke setiap baris dalam daftar file yang diberikan oleh file.
Dengan menggunakan mekanisme yang sama, kita dapat menuliskan contoh nomor telepon di atas sebagai berikut -
$ sed -e 's/^[[:digit:]]\{3\}/(&)/g' \
-e 's/)[[:digit:]]\{3\}/&-/g' phone.txt
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217
Note - Pada contoh di atas, alih-alih mengulang kata kunci kelas karakter [[:digit:]] tiga kali, kami menggantinya dengan \{3\}, yang berarti persamaan reguler sebelumnya dicocokkan tiga kali. Kami juga telah menggunakan\ untuk memberikan jeda baris dan ini harus dihapus sebelum perintah dijalankan.
Referensi Belakang
Itu ampersand metacharacterberguna, tetapi yang lebih berguna adalah kemampuan untuk menentukan kawasan tertentu dalam ekspresi reguler. Wilayah khusus ini dapat digunakan sebagai referensi dalam string pengganti Anda. Dengan menentukan bagian tertentu dari ekspresi reguler, Anda kemudian dapat merujuk kembali ke bagian tersebut dengan karakter referensi khusus.
Melakukan back references, Anda harus menentukan wilayah terlebih dahulu, lalu merujuk kembali ke wilayah tersebut. Untuk menentukan wilayah, Anda menyisipkanbackslashed parenthesesdi sekitar setiap wilayah yang diminati. Wilayah pertama yang Anda kelilingi dengan garis miring terbalik kemudian direferensikan\1, wilayah kedua oleh \2, dan seterusnya.
Asumsi phone.txt memiliki teks berikut -
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217
Coba perintah berikut -
$ cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area \
code: \1 Second: \2 Third: \3/'
Area code: (555) Second: 555- Third: 1212
Area code: (555) Second: 555- Third: 1213
Area code: (555) Second: 555- Third: 1214
Area code: (666) Second: 555- Third: 1215
Area code: (666) Second: 555- Third: 1216
Area code: (777) Second: 555- Third: 1217
Note - Dalam contoh di atas, setiap ekspresi reguler di dalam tanda kurung akan direferensikan kembali oleh \1, \2dan seterusnya. Kami telah menggunakan\untuk memberikan jeda baris di sini. Ini harus dihapus sebelum menjalankan perintah.