Bash Regexps untuk pemula dengan contoh

Bash Regexps untuk pemula dengan contoh

Menggunakan ekspresi reguler dalam bash memberi Anda banyak kekuatan untuk menguraikan hampir setiap string teks yang mungkin (atau bahkan dokumen penuh), dan mengubahnya menjadi hampir semua output yang diinginkan. Jika Anda secara teratur menggunakan Bash, atau jika Anda secara teratur bekerja dengan daftar, string tekstual, atau dokumen di Linux, Anda akan menemukan bahwa banyak pekerjaan dapat disederhanakan dengan mempelajari cara menggunakan ekspresi reguler di Bash. Lanjutkan Membaca untuk Mempelajari Keterampilan Ekspresi Reguler Dasar! Jika Anda sudah terbiasa dengan ekspresi reguler dasar dalam Bash atau bahasa pengkodean lainnya, lihat ekspresi reguler Bash kami yang lebih canggih. Jika tidak, lanjutkan membaca untuk mempelajari keterampilan ekspresi reguler BASH BASH!

Dalam tutorial ini Anda akan belajar:

  • Cara menggunakan ekspresi reguler pada baris perintah di bash
  • Bagaimana ekspresi reguler dapat menguraikan dan mengubah string teks dan/atau dokumen apa pun
  • Contoh Penggunaan Dasar dari Ekspresi Reguler dalam Bash
Bash Regexps untuk pemula dengan contoh

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi Linux-independen
Perangkat lunak Baris perintah bash, sistem berbasis Linux
Lainnya Utilitas SED digunakan sebagai contoh alat untuk menggunakan ekspresi reguler
Konvensi # - mensyaratkan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$-mensyaratkan Linux-Commands untuk dieksekusi sebagai pengguna reguler yang tidak istimewa


Contoh 1: Ekspresi reguler pertama kami

Ada beberapa utilitas baris perintah umum seperti SED dan GREP yang menerima input ekspresi reguler. Dan, Anda tidak harus membuat perubahan dalam alat (gunakan atau pengaturan) untuk dapat menggunakan ekspresi reguler juga; Mereka secara default Regex-Aware. Mari kita lihat contoh non-Regex di mana kita berubah ABC ke dalam xyz Pertama:

$ echo 'abc' | sed 's/abc/xyz/' xyz 

Di sini kami telah menggunakan gema untuk menghasilkan string ABC. Selanjutnya kami melewati output dari gema ini (menggunakan pipa, saya.e. |, karakter) ke utilitas sed. Sed adalah editor aliran untuk memfilter dan mengubah teks. Saya mendorong Anda untuk checkout itu manual terperinci dengan mengetik manusia sed di baris perintah.

Setelah diteruskan ke SED, kami mengubah string dengan menggunakan sintaksis spesifik Sed (dan Regex-Aware). Perintah yang kami lewati ke SED (yaitu S/ABC/XYZ/) juga dapat dibaca sebagai Pengganti ABC dengan Wyz. Itu S singkatan dari pengganti, dan karakter pemisah (/ Dalam kasus kami) menunjukkan di mana satu bagian dari perintah berakhir dan/atau yang lain dimulai. Perhatikan bahwa kita juga dapat menggunakan karakter pemisah lain di SED |, seperti yang akan kita lihat dalam contoh selanjutnya.

Sekarang, mari kita ubah perintah ini menjadi contoh ekspresi reguler.

$ echo 'abc' | Sed's/ S./xyz/g 'xyzxyzxyz 


Wow, apa yang terjadi di sini? 🙂

Kami membuat beberapa perubahan kecil, yang secara signifikan mempengaruhi output yang dihasilkan. Pertama, kami bertukar ABC di baris perintah sed .. Ini bukan titik biasa/literal, melainkan titik ekspresi reguler. Dan, secara teratur, sebuah titik berarti karakter apa pun. Hal -hal harus mulai terlihat lebih jelas sekarang, terutama ketika Anda melihat perubahan kecil lainnya yang kami buat: G. Cara termudah untuk dipikirkan G adalah sebagai global; Pencarian dan ganti yang berulang.

Perhatikan di sini juga bagaimana S adalah perintah SED kami yang sebenarnya, diikuti oleh opsi untuk perintah tersebut (dua teks dari penggantian), dan G adalah kualifikasi atas perintah. Memahami ini dengan baik membantu Anda mempelajari sintaks sed pada saat yang sama.

Jadi, berbeda dengan contoh ekspresi non-reguler kami, dan dalam bahasa alami, perintah baru ini dapat dibaca sebagai Ganti karakter apa pun dengan xyz, dan berulang -ulang ('secara global') melakukannya sampai Anda mencapai ujung string. Dengan kata lain, A diubah menjadi xyz, B diubah menjadi xyz dll., menghasilkan output triple xyz.

Semua ada di atas? Besar! Anda baru belajar cara menggunakan ekspresi reguler. Mari selami lebih jauh.

Contoh 2: peringatan kecil

$ echo 'abc' | sed 's | \.| XYZ | G 'ABC 

Ups. Apa yang telah terjadi? Kami membuat beberapa perubahan kecil, dan output berubah secara substansial, seperti pada contoh kami sebelumnya. Ekspresi reguler sangat kuat, seperti yang dapat Anda lihat di sini, dan bahkan perubahan kecil dapat membuat perbedaan besar dalam output. Oleh karena itu, biasanya ada kebutuhan untuk menguji ekspresi Anda dengan baik. Dan, sementara tidak terjadi di sini, juga sangat penting untuk selalu mempertimbangkan bagaimana output dari ekspresi reguler dapat dipengaruhi oleh input yang berbeda. Seringkali, input yang sedikit berubah atau dimodifikasi akan menghasilkan output yang sangat berbeda (dan sering keliru).

Kami mengubah dua item kecil; kami menempatkan a \ sebelum titik, dan kami mengubah pemisah dari / ke |. Perubahan yang terakhir sama sekali tidak membuat perbedaan, seperti yang dapat kita lihat dari output ini;

$ echo 'abc' | Sed's |.| xyz | g 'xyzxyzxyz 


Dan kami dapat memeriksa ulang temuan kami sejauh ini dengan menggunakan perintah ini:

$ echo 'abc' | sed 's/\./xyz/g 'ABC 

Seperti yang diharapkan, | ke / Perubahan tidak membuat perbedaan.

Jadi kembali ke dilema kita - haruskah kita mengatakan bahwa perubahan kecil dari penambahan \ salah? Tapi apakah itu benar -benar kesalahan?

TIDAK. Apa yang telah kami lakukan dengan membuat perubahan sederhana ini, adalah membuat . titik menjadi literal (\.) dot. Dengan kata lain, ini bukan lagi ekspresi reguler yang nyata di tempat kerja, tetapi penggantian string tekstual sederhana yang dapat dibaca sebagai Ganti titik literal ke dalam xyz, dan lakukan itu berulang -ulang.

Mari Buktikan Ini;

$ echo 'ab… c' | sed 's/\./xyz/g 'abxyzxyzc 

Ini seperti yang diharapkan: Dua titik literal diubah, secara individual (karena sifat berulang dari G kualifikasi), untuk xyz, hasil keseluruhan abxyzxyzc.

Super! Mari kita kembangkan sedikit lebih banyak sekarang.

Contoh 3: Bawalah

Tidak ada yang seperti menyelam di kepala terlebih dahulu, benar? Mungkin. Sampai Anda melihat ini;

$ echo 'a ... b… c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd 

Ya, terlalu rumit, setidaknya pada pandangan pertama. Mari kita mulai dengan penyederhanaannya:

$ echo 'a ... b… c' | sed 's | [\.b] \+| d | g; ' ADC 


Masih terlihat sedikit rumit, tetapi Anda akan segera memahaminya. Jadi, ambil string input A ... B… C, Kita dapat melihat - berdasarkan contoh kami sebelumnya - bahwa kami mencari titik literal (\.). Namun, dalam hal ini diikuti oleh B dan dikelilingi oleh [ Dan ]. Bagian dari ekspresi reguler ini ([\.B]) dapat dibaca sebagai titik literal apa pun, atau karakternya B (Sejauh ini tidak terulang-ulang; i.e. satu piagam, salah satu dari mereka, akan cocok dengan pemilih ini).

Selanjutnya, kami memenuhi syarat ini sedikit lebih jauh dengan menambahkan \+ untuk ini kotak pilihan. Itu \+ menunjukkan bahwa kami mencari setidaknya satu, dan mungkin lebih banyak, dari karakter yang terdaftar ini (titik literal dan b). Perhatikan bahwa karakter yang dicari harus tepat di sebelah satu sama lain, dalam urutan apa pun.

Misalnya teks ... B… BBBB… masih akan dicocokkan sebagai kejadian tunggal, sedangkan ... B… BBB… b.B… BB (Perhatikan ruangnya) akan cocok sebagai terpisah (berulang) kejadian, dan keduanya (i.e. bukan hanya yang pertama) akan dicocokkan. Dan, dalam hal ini, keduanya akan ditindaklanjuti karena G Kualifikasi global/berulang.

Dengan kata lain, dalam bahasa alami kita bisa membaca ekspresi reguler ini sebagai Ganti urutan karakter yang berdekatan . Dan B dengan D dan lakukan itu berulang -ulang.

Dapatkah Anda melihat apa yang terjadi? Di string input yang kami miliki … B… , yang dicocokkan dengan ekspresi reguler karena hanya berisi \. Dan B karakter. Itu kemudian diganti D sehingga menyebabkan ADC.

Contoh kami yang lebih besar sekarang terlihat lebih sederhana tiba -tiba. Mari kita kembali ke sana:

$ echo 'a ... b… c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd 

Berpikir tentang bagaimana bagian pertama dari perintah SED berubah A ... B… C ke dalam ADC, Kami sekarang dapat memikirkan ini ADC sebagai input ke perintah kedua di SED; s | [a-c] | d | g. Perhatikan bagaimana kedua perintah SED dipisahkan oleh ;.

Semua yang terjadi adalah bahwa output dari yang pertama diambil sebagai input untuk perintah selanjutnya. Ini hampir selalu berfungsi, meskipun ada waktu (saat menggunakan modifikasi teks/dokumen yang kompleks) di mana lebih baik untuk melewati output dari satu perintah SED yang sebenarnya ke dalam perintah SED lain menggunakan pipa bash (|).

Menganalisis perintah kedua (s | [a-c] | d | g) Kami melihat bagaimana kami memiliki yang lain kotak pilihan yang akan memilih huruf dari A ke C ([a-c])); itu - menunjukkan berbagai huruf, yang merupakan bagian dari sintaks ekspresi reguler.

Bagian lain dari perintah ini berbicara sendiri sekarang. Secara total, perintah kedua ini dapat dibaca sebagai Ganti karakter literal apa pun dengan jangkauan A-C (i.e. A, B atau C) ke dalam D dan lakukan itu berulang -ulang. Hasilnya adalah bahwa a, d dan c (output dari ADC dari perintah pertama kami) diterjemahkan ddd.

Perintah yang sangat kompleks itu tidak terlihat begitu menakutkan lagi sekarang, lakukanlah? Mari Bulatkan.

Contoh 4: Pesan Perpisahan

gema 'semoga harimu menyenangkan' | Sed's | $ | all |; s | y | y to |; s | $ | you |; s | to [la] \+| to | g; s | $ | semua | ' 


Bisakah Anda mengetahuinya? Tip; $ cara akhir baris dalam ekspresi reguler. Semua sisa regex kompleks ini menggunakan pengetahuan dari artikel ini. Apa outputnya? Lihat apakah Anda dapat mengetahuinya menggunakan selembar kertas, tanpa menggunakan baris perintah. Jika Anda melakukannya - atau jika Anda tidak 🙂 - beri tahu kami di komentar di bawah.

Kesimpulan

Dalam tutorial ini, kami memiliki pengantar ekspresi reguler dasar, bergabung dengan beberapa (lidah-di-pipi) lebih banyak contoh canggih.

Saat mempelajari ekspresi reguler, dan memeriksa kode orang lain, Anda akan melihat ekspresi reguler yang terlihat rumit. Luangkan waktu untuk mencari tahu, dan bermain -main dengan ekspresi reguler di baris perintah. Anda akan segera menjadi seorang ahli, dan sementara analisis regex yang kompleks biasanya diperlukan (pikiran tidak meminjamkan dirinya dengan mudah untuk membaca informasi yang begitu padat), itu akan menjadi lebih mudah. Anda juga akan menemukan bahwa Regex yang tampak kompleks, pada analisis lebih lanjut, biasanya terlihat cukup sederhana setelah Anda memahaminya - seperti pada contoh di atas.

Anda sekarang mungkin juga ingin membaca artikel kami tentang ekspresi reguler di Python karena banyak informasi yang disediakan di sana juga berlaku untuk Bash Ekspresi Reguler, meskipun beberapa persyaratan pemformatan sedikit berbeda. Ini akan meningkatkan pemahaman Anda tentang ekspresi reguler, cara menggunakannya, dan cara menerapkannya dalam berbagai situasi dan bahasa pengkodean. Setelah Anda menjadi pakar regex, garis kecil perbedaan antara alat dan bahasa pemrograman biasanya memudar, dan Anda akan cenderung mengingat persyaratan sintaks tertentu untuk setiap bahasa atau alat yang Anda kerjakan/dengan.

Menikmati!

Tutorial Linux Terkait:

  • Lanjutan regex bash canggih dengan contoh
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Ekspresi reguler Python dengan contoh
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 3
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 1
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
  • Hal -hal yang harus diinstal pada Ubuntu 22.04
  • Idiom variabel lanjutan bash untuk sensitivitas kasus…