Editor Aliran - Ekspresi Reguler

Ekspresi reguler inilah yang membuat SED kuat dan efisien. Sejumlah tugas kompleks dapat diselesaikan dengan ekspresi reguler. Semua pakar baris perintah mengetahui kekuatan ekspresi reguler.

Seperti banyak utilitas GNU / Linux lainnya, SED juga mendukung ekspresi reguler, yang sering disebut sebagai regex. Bab ini menjelaskan ekspresi reguler secara detail. Bab ini dibagi menjadi tiga bagian: Ekspresi reguler standar, kelas ekspresi reguler POSIX, dan karakter Meta.

Ekspresi Reguler Standar

Awal baris (^)

Dalam terminologi ekspresi reguler, simbol tanda sisipan (^) cocok dengan awal baris. Contoh berikut mencetak semua garis yang dimulai dengan pola "The".

[jerry]$ sed -n '/^The/ p' books.txt

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

The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho

Akhir Baris ($)

Akhir baris diwakili oleh simbol dolar ($). Contoh berikut mencetak garis yang diakhiri dengan "Coelho".

[jerry]$ sed -n '/Coelho$/ p' books.txt

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

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

Karakter Tunggal (.)

Titik (.) Cocok dengan karakter tunggal apa pun kecuali karakter akhir baris. Contoh berikut mencetak ketiga kata huruf yang diakhiri dengan karakter "t".

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

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

cat 
bat 
rat 
mat

Cocokkan Set Karakter ([])

Dalam terminologi ekspresi reguler, kumpulan karakter diwakili oleh tanda kurung siku ([]). Ini digunakan untuk mencocokkan hanya satu dari beberapa karakter. Contoh berikut cocok dengan pola "Panggilan" dan "Tinggi", tetapi tidak dengan "Bola".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

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

Call 
Tall

Set Eksklusif ([^])

Dalam himpunan eksklusif, tanda sisipan meniadakan rangkaian karakter dalam tanda kurung siku. Contoh berikut hanya mencetak "Bola".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

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

Ball

Rentang Karakter ([-])

Jika rentang karakter diberikan, ekspresi reguler cocok dengan karakter apa pun dalam rentang yang ditentukan dalam tanda kurung siku. Contoh berikut cocok dengan "Panggilan" dan "Tinggi" tetapi tidak dengan "Bola".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'

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

Call 
Tall

Sekarang mari kita ubah range menjadi "AP" dan amati hasilnya.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'

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

Call 
Ball

Zero on One Occurrence (\?)

Di SED, tanda tanya (\?) Cocok dengan nol atau satu kemunculan karakter sebelumnya. Contoh berikut cocok dengan "Behavior" serta "Behavior". Di sini, kami menjadikan "u" sebagai karakter opsional dengan menggunakan "\?".

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'

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

Behaviour 
Behavior

Satu atau Lebih Kejadian (\ +)

Di SED, simbol plus (\ +) cocok dengan satu atau lebih kemunculan karakter sebelumnya. Contoh berikut cocok dengan satu atau lebih kemunculan "2".

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

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

22 
123 
234 
222

Zero atau Lebih Kejadian (*)

Tanda bintang (*) cocok dengan nol atau lebih kemunculan karakter sebelumnya. Contoh berikut cocok dengan "ca", "cat", "catt", dan seterusnya.

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'

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

ca 
cat

Tepat N Kejadian {n}

{n} sama persis dengan kemunculan "n" dari karakter sebelumnya. Contoh berikut hanya mencetak tiga digit angka. Namun sebelum itu, Anda perlu membuat file berikut yang hanya berisi angka.

[jerry]$ cat numbers.txt

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

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

Mari kita tulis ekspresi SED.

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt

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

100

Perhatikan bahwa pasangan tanda kurung kurawal dipisahkan oleh karakter "\".

Setidaknya n Kejadian {n,}

{n,} cocok dengan setidaknya "n" kemunculan dari karakter sebelumnya. Contoh berikut mencetak semua angka yang lebih besar dari atau sama dengan lima digit.

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

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

10000 
100000 
1000000
10000000 
100000000 
1000000000

M ke N Kejadian {m, n}

{m, n} cocok dengan setidaknya "m" dan paling banyak "n" kemunculan dari karakter sebelumnya. Contoh berikut mencetak semua nomor yang memiliki setidaknya lima digit tetapi tidak lebih dari delapan digit.

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

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

10000 
100000 
1000000 
10000000

Pipa (|)

Di SED, karakter pipa berperilaku seperti operasi OR logis. Ini cocok dengan item dari kedua sisi pipa. Contoh berikut cocok dengan "str1" atau "str3".

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'

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

str1 
str3

Perhatikan bahwa pasangan tanda kurung dan pipa (|) dipisahkan oleh karakter "\".

Karakter Lolos

Ada karakter khusus tertentu. Misalnya, baris baru diwakili oleh "\ n", carriage return diwakili oleh "\ r", dan seterusnya. Untuk menggunakan karakter ini ke dalam konteks ASCII biasa, kita harus menghindarinya menggunakan karakter garis miring ke belakang (\). Bab ini menggambarkan pelarian dari karakter khusus.

Meloloskan diri dari "\"

Contoh berikut cocok dengan pola "\".

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

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

str1\str2

Meloloskan diri dari "\ n"

Contoh berikut cocok dengan karakter baris baru.

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

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

str1\nstr2

Meloloskan diri dari "\ r"

Contoh berikut cocok dengan carriage return.

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

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

str1\rstr2

Meloloskan diri dari "\ dnnn"

Ini cocok dengan karakter yang nilai ASCII desimalnya adalah "nnn". Contoh berikut hanya cocok dengan karakter "a".

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

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

a

Meloloskan diri dari "\ onnn"

Ini cocok dengan karakter yang nilai ASCII oktalnya adalah "nnn". Contoh berikut hanya cocok dengan karakter "b".

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'

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

b

Ini cocok dengan karakter yang nilai ASCII heksadesimalnya adalah "nnn". Contoh berikut hanya cocok dengan karakter "c".

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

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

c

Kelas Ekspresi Reguler POSIX

Ada kata khusus tertentu yang memiliki arti khusus. Kata yang dicadangkan ini disebut sebagai kelas POSIX dari ekspresi reguler. Bagian ini menjelaskan kelas POSIX yang didukung oleh SED.

[: alnum:]

Ini menyiratkan karakter alfabet dan numerik. Contoh berikut hanya cocok dengan "Satu" dan "123", tetapi tidak cocok dengan karakter tab.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

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

One 
123

[:alfa:]

Ini hanya menyiratkan karakter alfabet. Contoh berikut hanya cocok dengan kata "Satu".

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

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

One

[:kosong:]

Ini menyiratkan karakter kosong yang bisa berupa spasi atau tab. Contoh berikut hanya cocok dengan karakter tab.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

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

^I$

Perhatikan bahwa perintah "cat -vte" digunakan untuk menampilkan karakter tab (^ I).

[:angka:]

Ini hanya menyiratkan angka desimal. Contoh berikut hanya cocok dengan digit "123".

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'

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

123

[:menurunkan:]

Ini hanya menyiratkan huruf kecil. Contoh berikut hanya cocok dengan "satu".

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'

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

one

[:atas:]

Ini hanya menyiratkan huruf besar. Contoh berikut hanya cocok dengan "DUA".

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

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

TWO

[: punct:]

Ini menyiratkan tanda baca yang menyertakan karakter non-spasi atau alfanumerik

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

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

One,Two

[:ruang:]

Ini menyiratkan karakter spasi. Contoh berikut menggambarkan hal ini.

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte

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

123^L^I$

Metakarakter

Seperti ekspresi reguler tradisional, SED juga mendukung karakter meta. Ini adalah ekspresi reguler gaya Perl. Perhatikan bahwa dukungan karakter meta adalah khusus GNU SED dan mungkin tidak berfungsi dengan varian SED lainnya. Mari kita bahas karakter meta secara detail.

Batas Kata (\ b)

Dalam terminologi ekspresi reguler, "\ b" cocok dengan batas kata. Misalnya, "\ bthe \ b" cocok dengan "yang" tetapi tidak dengan "ini", "di sana", "mereka", "lalu", dan seterusnya. Contoh berikut menggambarkan hal ini.

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

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

the

Batasan Non-Kata (\ B)

Dalam terminologi ekspresi reguler, "\ B" cocok dengan batas non-kata. Misalnya, "\ B" cocok dengan "ini" dan "mereka" tetapi tidak dengan "yang". Contoh berikut menggambarkan hal ini.

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

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

these 
they

Spasi Putih Tunggal

Dalam SED, "\ s" menyiratkan karakter spasi putih tunggal. Contoh berikut cocok dengan "Baris \ t1" tetapi tidak cocok dengan "Baris1".

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

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

Line 1

Non-Spasi Putih (\ S)

Dalam SED, "\ S" menyiratkan karakter spasi putih tunggal. Contoh berikut cocok dengan "Line2" tetapi tidak cocok dengan "Line \ t1".

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'

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

Line2

Karakter Kata Tunggal (\ w)

Dalam SED, "\ w" menyiratkan karakter kata tunggal, yaitu karakter alfabet, angka, dan garis bawah (_). Contoh berikut menggambarkan hal ini.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

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

One 
123 
1_2

Karakter Non-Kata Tunggal (\ W)

Dalam SED, "\ W" menyiratkan karakter non-kata tunggal yang sangat berlawanan dengan "\ w". Contoh berikut menggambarkan hal ini.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

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

&;#

Awal dari Pattern Space (\ `)

Dalam SED, "\` "menyiratkan awal dari ruang pola. Contoh berikut hanya cocok dengan kata "Satu".

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'

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

One