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.