Pencarian sejauh ini selalu memakai teks persis: grep Bandung hanya menemukan baris yang memuat kata itu apa adanya. Padahal banyak pertanyaan nyata berbentuk pola — “diawali angka”, “berapa pun digit”, atau “nomor HP yang dimulai 08”. Regular expression (regex) adalah bahasa kecil untuk menulis pola seperti itu, dipahami oleh grep, sed, dan awk. Chapter ini membahas pola extended dengan grep -E, substitusi berpola dengan sed -E, dan validasi input di dalam skrip — fondasi yang dipakai ulang di seluruh Section Text Processing nanti.

Karakter Khusus dan Anchor #

Dalam regex, sebagian besar huruf berdiri untuk dirinya sendiri; kekuatannya ada pada karakter khusus. Dua yang paling fundamental adalah anchor ^ dan $ yang menambatkan pola ke awal dan akhir baris:

bash
printf 'apel\nApel\njeruk12\napel-merah\nnasi-goreng\n' > tes.txt
grep -E '^ap' tes.txt
grep -E 'goreng$' tes.txt

Output yang Dihasilkan:

text
apel
apel-merah
nasi-goreng

Pola ^ap hanya menerima baris yang diawali ap — apel dan apel-merah lolos, sedangkan Apel gugur karena huruf besarnya beda dan jeruk12 tidak diawali ap. Sebaliknya goreng$ menuntut baris diakhiri goreng. Tanpa anchor, pola dicari di mana pun dalam baris: grep -E 'apel' menemukan apel dan apel-merah sekaligus. Karakter khusus yang paling sering dipakai dirangkum berikut:

KarakterArti
.satu karakter apa pun
^ / $awal / akhir baris
[abc] / [0-9]satu karakter dari kumpulan / rentang
* / + / ?0+, 1+, atau 0-1 kali pengulangan
{2,4}pengulangan 2 sampai 4 kali
(ab|cd)kelompok dengan pilihan

Kelas Karakter dan Pengelompokan #

Kelas [...] menyaring satu karakter menurut anggota atau rentangnya, sedangkan kurung (...) mengelompokkan pola — paling berguna untuk pilihan |. Fixture dibuat ulang agar tiap blok tetap mandiri:

bash
printf 'apel\nApel\njeruk12\napel-merah\nnasi-goreng\n' > tes.txt
grep -E '[0-9]' tes.txt
grep -E '^[A-Z]' tes.txt
grep -E '^(apel|nasi)' tes.txt

Output yang Dihasilkan:

text
jeruk12
Apel
apel
apel-merah
nasi-goreng

Pola [0-9] hanya menemukan jeruk12 — satu-satunya baris yang memuat digit. Pola ^[A-Z] membuktikan pencarian case-sensitive: hanya Apel berawalan huruf besar. Pada pola terakhir, kelompok (apel|nasi) dibaca “apel atau nasi” sehingga tiga baris berawalan salah satu kata itu lolos, dengan Apel tetap tersingkir. Kelompok juga bisa diulang quantifier seperti (ab)+; backreference \1 untuk mengingat kelompok tidak diwajibkan standar POSIX, jadi gunakan secukupnya. Daftar lengkap sintaksnya terbuka pada halaman manual grep(1) .

Substitusi Berpola dengan sed -E #

Perintah sed mengganti teks lewat perintah s/pola/pengganti/, dan opsi -E menjadikan polanya regex extended. Bagian pola yang dibungkus kurung bisa dipanggil ulang di bagian pengganti sebagai \1, \2 — urutannya boleh dibalik:

bash
printf 'harga apel 5000\nharga jeruk 7000\n' > belanja.txt
sed -E 's/harga ([a-z]+) ([0-9]+)/\2 x \1/' belanja.txt

Output yang Dihasilkan:

text
5000 x apel
7000 x jeruk

Pola harga ([a-z]+) ([0-9]+) menangkap dua kelompok: nama buah dan angka harganya. Bagian pengganti \2 x \1 menyusun ulang hasilnya — angka duluan, nama belakang — sehingga harga apel 5000 menjadi 5000 x apel. sed mencetak hasil penggantian ke stdout tanpa mengubah file aslinya; opsi -i baru menulisnya kembali ke file. Spesifikasi lengkap perintah substitusi dibaca pada standar POSIX sed .

Validasi Pola dalam Skrip #

Penggunaan regex yang paling berguna di skrip adalah memvalidasi input sebelum diproses. Operator =~ di dalam [[ ]] menguji string terhadap pola regex extended; karena pola disimpan sebagai argumen, satu function cukup untuk semua jenis validasi:

bash
cat > validasi.sh <<'AKHIR'
#!/bin/bash
cek_pola() {
  if [[ "$1" =~ $2 ]]; then
    echo "valid  : $1"
  else
    echo "invalid: $1"
  fi
}
cek_pola 081234567890 '^08[0-9]{8,11}$'
cek_pola 12345 '^08[0-9]{8,11}$'
cek_pola [email protected] '^[a-z.]+@example\.com$'
cek_pola [email protected] '^[a-z.]+@example\.com$'
AKHIR
bash validasi.sh

Output yang Dihasilkan:

text
valid  : 081234567890
invalid: 12345
valid  : [email protected]
invalid: [email protected]

Mari kita bedah isi validasi.sh baris per barisnya:

  1. Baris 2 (cek_pola() {): function pemeriksa serbaguna — argumen pertama nilai yang diuji, argumen kedua polanya.
  2. Baris 3 ([[ "$1" =~ $2 ]]): operator =~ menguji string terhadap regex. Nilainya dikutip "$1" agar aman, tetapi polanya sengaja tidak dikutip — "$2" dengan kutip justru dicari sebagai teks literal.
  3. Baris 9-10 (^08[0-9]{8,11}$): nomor HP valid harus diawali 08, diikuti 8 sampai 11 digit, lalu baris berakhir — total 10 sampai 13 angka tanpa spasi maupun tanda hubung, jadi 12345 ditolak.
  4. Baris 11-12 (^[a-z.]+@example\.com$): email latihan harus berupa huruf kecil dan titik satu kali atau lebih, lalu tepat @example.com — titiknya di-escape \., sehingga [email protected] gugur.

Pola seperti ini adalah gerbang kualitas data: input yang tidak lolos cukup ditolak dengan exit 1 dari pola Chapter Exit Status dan Error Handling. Regex kini melengkapi kotak alat pencarian kita. Langkah berikutnya memperbesar cakupannya: bukan lagi satu file, melainkan membandingkan dua aliran output sekaligus — dibuka oleh Chapter Process Substitution.