GNU/Linux >> Belajar Linux >  >> Linux

Ekspresi reguler:Menarik semuanya bersama-sama

Dalam Memperkenalkan ekspresi reguler , saya memperkenalkan konsep dan dasar-dasarnya, lalu di Memulai ekspresi reguler:Sebuah contoh , kami menelusuri contoh yang membersihkan daftar nama dan alamat email sehingga konsisten dan dapat diuraikan. Setelah menyelami Regex dan grep:Aliran data dan blok penyusun , di mana kita masuk ke lebih detail tentang ekspresi reguler, sekarang saatnya untuk mengeksplorasi cara-cara di mana kita dapat mempersingkat dan menyederhanakan program baris perintah dari contoh pertama. Kami akan fokus di sini pada grep dan sed .

Contoh:Menyederhanakan program milis

Pertama, mari kita lihat kembali contoh pertama kita, di mana kita membangun program antarmuka baris perintah (CLI) berikut:

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$" | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Anda mungkin menemukan ekspresi reguler lebih mudah dibaca pada saat ini, tetapi program ini dapat disederhanakan.

kucing dan grep

Mari kita mulai dengan berfokus pada awal perintah, yang melibatkan cat dan grep :

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$"

Kita bisa menggabungkan keduanya grep pernyataan, yang awalnya terlihat seperti ini:

| grep -v Team | grep -v "^\s*$" 

Kiat: Ketika STDOUT dari grep tidak disalurkan melalui utilitas lain, dan saat menggunakan emulator terminal yang mendukung warna, kecocokan ekspresi reguler disorot dalam aliran data keluaran.

Perintah yang direvisi adalah:

grep -vE "Team|^\s*$"

Di sini, kami telah menambahkan E opsi, yang menentukan regex yang diperluas. Menurut grep halaman manual:

"Di grep GNU tidak ada perbedaan dalam fungsionalitas yang tersedia antara sintaks dasar dan sintaks tambahan."

Pernyataan ini tidak sepenuhnya benar, karena ekspresi gabungan baru kita gagal tanpa E pilihan. Jalankan perintah berikut untuk melihat hasilnya:

[student@studentvm1 testing]$ cat Experiment_6-1.txt | grep -vE "Team|^\s*$"

Cobalah tanpa E pilihan.

Sekarang, mari kita lihat cat . grep tool ini juga dapat membaca data dari sebuah file, sehingga kita dapat menghilangkan cat perintah seluruhnya:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt

Perubahan ini dan yang sebelumnya bersama-sama memberi kita program CLI yang agak disederhanakan berikut ini:

grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Perintah ini lebih pendek, lebih ringkas, dan akan dieksekusi lebih cepat karena grep hanya perlu mengurai aliran data sekali.

Catatan: Sekali lagi, penting untuk disadari bahwa solusi ini bukan satu-satunya. Ada beberapa metode berbeda di Bash untuk menghasilkan keluaran yang sama, dan ada bahasa lain seperti Python dan Perl yang juga dapat digunakan. Dan, tentu saja, selalu ada makro LibreOffice Writer. Tapi, saya selalu dapat mengandalkan Bash sebagai bagian dari distribusi Linux apa pun. Saya dapat melakukan tugas-tugas ini menggunakan program Bash di komputer Linux mana pun, bahkan komputer tanpa desktop GUI, atau komputer yang memiliki desktop GUI tetapi tidak menginstal LibreOffice.

sed

Kami juga dapat menyederhanakan sed memerintah. sed utilitas tidak hanya memungkinkan mencari teks yang cocok dengan pola regex, tetapi juga dapat memodifikasi, menghapus, atau mengganti teks yang cocok. Saya menggunakan sed di baris perintah dan di skrip shell Bash sebagai cara cepat dan mudah untuk menemukan teks dan mengubahnya. Nama sed singkatan dari editor aliran karena beroperasi pada aliran data dengan cara yang sama seperti alat lain yang dapat mengubah aliran data. Sebagian besar perubahan tersebut melibatkan pemilihan jalur tertentu dari aliran data dan meneruskannya ke program transformator lain.

Catatan: Banyak orang menyebut alat seperti grep program filter , karena mereka memfilter baris yang tidak diinginkan dari aliran data. Saya lebih suka istilah transformator , karena alat seperti sed dan awk melakukan lebih dari sekadar menyaring. Mereka dapat menguji konten untuk berbagai kombinasi string dan mengubah konten yang cocok dengan berbagai cara. Alat seperti sort , head , tail , uniq , fmt , dan lebih banyak lagi, semuanya mengubah aliran data dengan cara tertentu.

Kita telah melihat sed dalam tindakan, tetapi sekarang, dengan pemahaman tentang ekspresi reguler, kita dapat menganalisis dan memahami penggunaan sebelumnya dengan lebih baik. Dimungkinkan untuk menggabungkan empat dari lima ekspresi yang digunakan dalam sed perintah menjadi satu ekspresi. sed perintah sekarang memiliki dua ekspresi, bukan lima:

sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Format ini membuat agak sulit untuk memahami ekspresi yang lebih kompleks. Perhatikan bahwa tidak peduli berapa banyak ekspresi, satu sed berisi perintah, aliran data hanya diurai sekali untuk mencocokkan semua ekspresi.

Mari kita periksa ekspresi yang direvisi lebih dekat:

-e "s/[]()\[]//g"

Secara default, sed menafsirkan semua [ karakter sebagai awal set, dan ] terakhir karakter sebagai akhir dari set itu. Jadi, pada kode di atas, yang pertama [ dan ] terakhir berisi himpunan. Intervensi ] karakter tidak ditafsirkan sebagai metakarakter.

Karena kita harus mencocokkan [ sebagai karakter literal untuk menghapusnya dari aliran data, dan sed biasanya menafsirkan [ sebagai metacharacter, kita perlu menghindarinya agar diinterpretasikan sebagai ] literal . Di situlah garis miring terbalik (\ ) masuk, memberi kami \[ di tengah.

Mari kita pasang versi baru ini ke dalam skrip CLI dan mengujinya:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Saya tahu apa yang Anda tanyakan:"Mengapa tidak menempatkan \[ setelah [ yang membuka set, dan sebelum ] karakter?" Cobalah seperti yang saya lakukan:

[student@studentvm1 testing]$  grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[\[]()]//g"`

Saya pikir itu harus berhasil, tetapi tidak. Sedikit hasil tak terduga seperti ini memperjelas bahwa kita harus berhati-hati dan menguji setiap regex dengan hati-hati untuk memastikan bahwa itu benar-benar melakukan apa yang kita inginkan.

Setelah beberapa percobaan saya sendiri, saya menemukan bahwa kurung siku kiri yang lolos \[ bekerja dengan baik di semua posisi ekspresi kecuali yang pertama. Perilaku ini dicatat dalam grep halaman manual, yang mungkin harus saya baca terlebih dahulu. Namun, saya menemukan bahwa eksperimen memperkuat hal-hal yang saya baca, dan saya biasanya menemukan hal-hal yang lebih menarik daripada yang saya cari.

Menambahkan komponen terakhir, awk pernyataan, program kami yang dioptimalkan terlihat seperti ini dan hasilnya persis seperti yang kami inginkan:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g" | awk '{print $1" "$2" <"$3">"}'

Alat lain yang mengimplementasikan ekspresi reguler

Banyak alat Linux mengimplementasikan ekspresi reguler. Sebagian besar implementasi tersebut sangat mirip dengan awk , grep , dan sed , jadi seharusnya mudah untuk mempelajari perbedaannya. Meskipun kita belum melihat secara detail awk, ini adalah bahasa pemrosesan teks yang kuat yang juga mengimplementasikan regex.

Sebagian besar editor teks yang lebih canggih menggunakan regex. Vim, gVim, Kate, dan GNU Emacs tidak terkecuali. less utilitas mengimplementasikan regex, seperti halnya fasilitas pencarian dan penggantian LibreOffice Writer.

Bahasa pemrograman seperti Perl, awk, dan Python juga berisi implementasi regex, yang membuatnya cocok untuk alat penulisan untuk manipulasi teks.

Sumber daya

Saya telah menemukan beberapa sumber yang bagus untuk belajar tentang ekspresi reguler. Ada lebih dari yang saya sebutkan di sini, tetapi ini adalah yang menurut saya sangat berguna:

  • grep halaman manual memiliki referensi yang baik tetapi tidak sesuai untuk mempelajari ekspresi reguler.
  • Buku O'Reilly, Menguasai Ekspresi Reguler , oleh Jeffrey E. F. Friedl, adalah tutorial dan referensi yang bagus untuk ekspresi reguler. Saya merekomendasikannya untuk siapa saja yang ingin menjadi sysadmin Linux karena Anda akan menggunakan ekspresi reguler.
  • Buku O'Reilly sed &awk:UNIX Power Tools , oleh Arnold Robbins dan Dale Dougherty, adalah satu lagi yang bagus. Ini mencakup kedua alat canggih ini dan juga memiliki diskusi yang sangat baik tentang ekspresi reguler.

Ada juga beberapa situs web bagus yang dapat membantu Anda mempelajari tentang ekspresi reguler, dan yang menyediakan contoh regex gaya buku masak yang menarik dan berguna. Ada beberapa yang meminta uang sebagai imbalan untuk menggunakannya. Jason Baker, Peninjau Teknis saya untuk Volume 1 dan 2 dari Menggunakan dan Mengelola Linux saya course menyarankan regexcrossword.com sebagai alat pembelajaran yang baik.

Ringkasan

Seri ini telah memberikan pengantar singkat tentang dunia ekspresi reguler yang kompleks. Kami telah menjelajahi implementasi regex di grep utilitas dalam kedalaman yang cukup untuk memberi Anda gambaran tentang beberapa hal menakjubkan yang dapat dicapai dengan regex. Kami juga telah melihat beberapa alat Linux dan bahasa pemrograman yang juga mengimplementasikan regex.

Tapi jangan salah! Kami hanya menggores permukaan alat ini, dan ekspresi reguler. Masih banyak yang harus dipelajari, dan seperti yang Anda lihat, ada beberapa sumber yang bagus untuk melakukannya.

Catatan: Artikel ini adalah versi Bab 6 yang sedikit dimodifikasi dari Volume 2 kursus belajar mandiri Linux saya, "Menggunakan dan Mengelola Linux:Nol ke SysAdmin," yang akan dirilis dari Apress pada akhir 2019.


Linux
  1. Ekspresi Reguler Tingkat Lanjut dalam Perintah Grep dengan 10 Contoh – Bagian II

  2. Ekspresi Reguler dalam Perintah Grep dengan 10 Contoh – Bagian I

  3. Apakah \d tidak didukung oleh ekspresi dasar grep?

  1. Apa artinya \b dalam pola grep?

  2. Ekspresi Reguler untuk menemukan karakter ganda di Bash

  3. rentang nomor ekstrak grep

  1. Memulai dengan ekspresi reguler:Sebuah contoh

  2. Memperkenalkan ekspresi reguler

  3. Mencantumkan semua alamat email dalam file dengan grep