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