Bash regexps untuk pemula dengan contoh
- 2365
- 359
- Noah Torp
Menggunakan ungkapan biasa di Bash memberikan anda banyak kuasa untuk menghuraikan hampir setiap rentetan teks yang boleh dibayangkan (atau dokumen penuh), dan mengubahnya menjadi hampir apa -apa output yang diingini. Jika anda kerap menggunakan Bash, atau jika anda kerap bekerja dengan senarai, rentetan teks, atau dokumen di Linux, anda akan mendapati bahawa banyak pekerjaan dapat dipermudahkan dengan mempelajari cara menggunakan ungkapan biasa di Bash. Teruskan membaca untuk mempelajari kemahiran ekspresi biasa bash asas! Sekiranya anda sudah biasa dengan ungkapan biasa asas dalam Bash atau bahasa pengekodan yang lain, lihat ungkapan biasa kami yang lebih maju. Sekiranya tidak, teruskan membaca untuk mempelajari kemahiran ekspresi biasa bash asas!
Dalam tutorial ini anda akan belajar:
- Cara Menggunakan Ekspresi Biasa Pada Talian Perintah di Bash
- Bagaimana ungkapan biasa dapat menghuraikan dan mengubah rentetan teks dan/atau dokumen
- Contoh penggunaan asas ekspresi biasa di Bash
Keperluan perisian dan konvensyen yang digunakan
Kategori | Keperluan, konvensyen atau versi perisian yang digunakan |
---|---|
Sistem | Pengedaran linux-bebas |
Perisian | Baris perintah bash, sistem berasaskan linux |
Yang lain | Utiliti SED digunakan sebagai alat contoh untuk menggunakan ekspresi biasa |
Konvensyen | # - Memerlukan komando linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah$-memerlukan komando Linux yang diberikan sebagai pengguna yang tidak berkadar biasa |
Contoh 1: Ungkapan biasa pertama kami
Terdapat beberapa utiliti baris arahan biasa seperti sed dan grep yang menerima input ungkapan biasa. Dan, anda tidak perlu membuat apa -apa perubahan dalam alat (penggunaan atau persediaan) untuk dapat menggunakan ungkapan biasa sama ada; mereka secara lalai regex-sadar. Mari lihat contoh bukan regex di mana kita berubah ABC
ke dalam XYZ
Pertama:
$ echo 'abc' | sed 's/abc/xyz/' xyz
Di sini kami telah menggunakan Echo untuk mengeluarkan rentetan ABC
. Seterusnya kita lulus output dari echo ini (menggunakan paip, i.e. |
, watak) ke utiliti SED. SED adalah editor aliran untuk penapisan dan mengubah teks. Saya menggalakkan anda untuk memeriksa manual terperinci dengan menaip lelaki sed
di baris arahan.
Setelah diteruskan ke SED, kami mengubah rentetan dengan menggunakan sintaks Sed khusus (dan regex-sware). Perintah yang kita lalui (iaitu s/abc/xyz/
) juga boleh dibaca sebagai pengganti ABC dengan WYZ
. The s
bermaksud pengganti, dan watak pemisah (/
dalam kes kita) menunjukkan di mana satu bahagian arahan berakhir dan/atau yang lain bermula. Perhatikan bahawa kita juga boleh menggunakan aksara pemisah lain di sed, seperti |
, Seperti yang akan kita lihat dalam contoh kemudian.
Sekarang, mari kita ubah perintah ini menjadi contoh ungkapan biasa.
$ echo 'abc' | sed 's/./xyz/g 'xyzxyzxyz
Wow, apa yang berlaku di sini? 🙂
Kami membuat beberapa perubahan kecil, yang telah menjejaskan output yang terhasil. Pertama, kami bertukar ABC
di baris arahan sed ke .
. Ini bukan titik biasa/literal, tetapi sebaliknya titik ekspresi biasa. Dan, dalam ungkapan biasa, titik bermaksud mana -mana watak. Perkara harus mula kelihatan lebih jelas sekarang, terutamanya apabila anda melihat perubahan kecil yang kami buat: g
. Cara paling mudah untuk difikirkan g
adalah seperti Global
; carian dan ganti berulang -ulang.
Perhatikan di sini juga bagaimana s
adalah perintah SED sebenar kami, diikuti dengan pilihan untuk perintah itu (kedua-dua dari teks penggantian), dan g
adalah kelayakan atas arahan. Memahami ini dengan baik membantu anda mempelajari sintaks sed pada masa yang sama.
Oleh itu, dalam beberapa kontras dengan contoh ekspresi bukan peratur kami, dan dalam bahasa semula jadi, arahan baru ini dapat dibaca sebagai Gantikan mana-mana-single-character dengan XYZ
, dan berulang -ulang ('di seluruh dunia') berbuat demikian sehingga anda sampai ke hujung rentetan. Dalam kata lain, a
diubah menjadi XYZ
, b
diubah menjadi XYZ
dan lain-lain., mengakibatkan output triple xyz.
Semua di atas kapal? Hebat! Anda baru belajar bagaimana menggunakan ungkapan biasa. Mari kita menyelam lebih jauh.
Contoh 2: Kaveat kecil
$ echo 'abc' | sed's | \.| xyz | g 'abc
Alamak. Apa yang berlaku? Kami membuat beberapa perubahan kecil, dan output berubah dengan ketara, sama seperti contoh sebelumnya. Ekspresi biasa sangat kuat, seperti yang anda dapat lihat di sini, dan juga perubahan kecil dapat membuat perbezaan besar dalam output. Oleh itu, biasanya ada keperluan untuk menguji ekspresi anda dengan baik. Dan, sementara tidak berlaku di sini, juga sangat penting untuk selalu mempertimbangkan bagaimana output ekspresi biasa mungkin dipengaruhi oleh input yang berbeza. Selalunya, input yang sedikit berubah atau diubah suai akan menghasilkan output yang sangat berbeza (dan sering salah).
Kami menukar dua item kecil; Kami meletakkan a \
sebelum titik, dan kami menukar pemisah dari /
ke |
. Perubahan yang terakhir tidak membuat perbezaan, seperti yang dapat kita lihat dari output ini;
$ echo 'abc' | sed's |.| xyz | g 'xyzxyzxyz
Dan kita boleh menyemak semula penemuan kami sejauh ini dengan menggunakan arahan ini:
$ echo 'abc' | sed 's/\./XYZ/G 'ABC
Seperti yang dijangkakan, |
ke /
Perubahan tidak ada perbezaan.
Oleh itu, kembali kepada dilema kita - adakah kita akan mengatakan bahawa perubahan kecil menambahkan \
bersalah? Tetapi adakah itu salah?
Tidak. Apa yang telah kita lakukan dengan membuat perubahan mudah ini, adalah menjadikannya .
Dot menjadi literal (\.
) titik. Dengan kata lain, ini tidak lagi merupakan ungkapan biasa yang sebenar di tempat kerja, tetapi penggantian rentetan teks mudah yang boleh dibaca sebagai menggantikan titik literal ke dalam XYZ
, dan berbuat demikian berulang -ulang.
Mari kita membuktikan ini;
$ echo 'ab ... c' | sed 's/\./xyz/g 'abxyzxyzc
Ini seperti yang diharapkan: dua titik harfiah telah diubah, secara individu (disebabkan sifat berulang -ulang dari g
kualifikasi), ke XYZ
, Hasil secara keseluruhan abxyzxyzc
.
Super! Mari berkembang sedikit lagi sekarang.
Contoh 3: Bawakannya
Tidak seperti menyelam di kepala dahulu, betul? Mungkin. Sehingga anda melihat ini;
$ echo 'a ... b ... c' | sed's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd
Ya, terlalu kompleks, sekurang -kurangnya pada pandangan pertama. Mari kita mulakan dengan penyederhanaannya:
$ echo 'a ... b ... c' | sed's | [\.b] \+| d | g; ' ADC
Masih kelihatan sedikit rumit, tetapi anda akan segera memahaminya. Jadi, mengambil rentetan input A ... b ... c
, kita dapat melihat - berdasarkan contoh sebelumnya - bahawa kita mencari titik literal (\.
). Walau bagaimanapun, dalam kes ini diikuti oleh b
dan dikelilingi oleh [
dan ]
. Bahagian ungkapan biasa ini ([\.b]
) boleh dibaca sebagai mana -mana titik literal, atau watak b
(setakat ini tidak berulang; i.e. Piagam tunggal, sama ada salah seorang daripada mereka, akan sepadan dengan pemilih ini).
Seterusnya, kami memenuhi syarat ini sedikit lagi dengan melaksanakan \+
untuk ini kotak pemilihan. The \+
menunjukkan bahawa kita mencari sekurang -kurangnya satu, dan mungkin lebih, dari watak -watak yang disenaraikan ini (titik literal dan b). Perhatikan bahawa watak -watak yang dicari perlu betul -betul bersebelahan dengan satu sama lain, dalam apa -apa perintah.
Contohnya teks ... B ... BBBB ..
masih akan dipadankan sebagai satu kejadian, sedangkan ... b ... bbb ... b.B ... BB
(perhatikan ruang) akan sepadan dengan berasingan (berulang -ulang) kejadian, dan kedua -duanya (i.e. bukan hanya yang pertama) akan dipadankan. Dan, dalam hal ini, kedua -duanya akan dilakukan kerana g
kelayakan global/berulang.
Dengan kata lain, dalam bahasa semula jadi kita dapat membaca ungkapan biasa ini sebagai menggantikan urutan watak yang bersebelahan .
dan b
dengan d
dan berbuat demikian berulang -ulang.
Bolehkah anda melihat apa yang berlaku? Dalam rentetan input yang kita ada ... b ..
, yang dipadankan dengan ungkapan biasa kerana hanya mengandungi \.
dan b
watak. Ia kemudian digantikan untuk d
mengakibatkan ADC
.
Contoh kami yang lebih besar sekarang kelihatan lebih mudah secara tiba -tiba. Mari melompat kembali:
$ echo 'a ... b ... c' | sed's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd
Memikirkan bagaimana bahagian pertama perintah sed berubah A ... b ... c
ke dalam ADC
, Sekarang kita boleh memikirkan perkara ini ADC
sebagai input kepada arahan kedua di sed; s | [a-c] | d | g
. Perhatikan bagaimana kedua -dua arahan sed dipisahkan oleh ;
.
Yang berlaku ialah output bekas yang diambil sebagai input untuk perintah berikutnya. Ini hampir selalu berfungsi, walaupun ada masa (apabila menggunakan pengubahsuaian teks/dokumen yang kompleks) di mana lebih baik untuk lulus output dari satu perintah sed sebenar ke arahan sed lain menggunakan paip bash (|
).
Menganalisis arahan kedua (s | [a-c] | d | g
) kita melihat bagaimana kita mempunyai yang lain kotak pemilihan yang akan memilih huruf dari A ke C ([A-C])
); The -
Menunjukkan pelbagai huruf, yang merupakan sebahagian daripada sintaks ekspresi biasa.
Bahagian lain arahan ini bercakap untuk diri mereka sekarang. Secara keseluruhan, arahan kedua ini dapat dibaca sebagai menggantikan mana -mana watak literal dengan julat A-C (i.e. A, B atau C)
ke dalam d
dan berbuat demikian berulang -ulang. Hasilnya ialah A, D dan C (output dari ADC
dari arahan pertama kami) diberikan DDD
.
Perintah yang sangat kompleks itu tidak kelihatan begitu menakutkan sekarang, adakah ia? Mari kita bulat.
Contoh 4: Mesej perpisahan
echo 'mempunyai hari yang hebat' | sed's | $ | semua |; s | y | y to |; s | $ | you |; s | to [la] \+| to | g; s | $ | Semua | '
Bolehkah anda mengetahuinya? Tip; $
bermaksud akhir garis dalam ungkapan biasa. Selebihnya regex kompleks ini menggunakan pengetahuan dari artikel ini. Apakah output? Lihat jika anda dapat memikirkannya menggunakan sekeping kertas, tanpa menggunakan baris arahan. Sekiranya anda melakukannya - atau jika anda tidak - beritahu kami dalam komen di bawah.
Kesimpulan
Dalam tutorial ini, kami mempunyai pengenalan kepada ekspresi asas asas, bergabung dengan beberapa (lidah-in-pipi) contoh yang lebih maju.
Semasa mempelajari ungkapan biasa, dan memeriksa kod orang lain, anda akan melihat ungkapan biasa yang kelihatan kompleks. Luangkan masa untuk memikirkannya, dan bermain -main dengan ungkapan biasa di baris arahan. Anda akan segera menjadi pakar, dan sementara analisis regex kompleks biasanya diperlukan (minda hanya tidak meminjamkan dirinya dengan mudah untuk membaca maklumat yang padat), ia akan menjadi lebih mudah. Anda juga akan mendapati bahawa regex yang kelihatan kompleks, pada analisis selanjutnya, biasanya kelihatan agak mudah apabila anda memahaminya - sama seperti dalam contoh di atas.
Anda sekarang juga ingin membaca artikel kami mengenai ungkapan biasa di Python kerana banyak maklumat yang disediakan di sana juga terpakai untuk mengekspresikan Bash, walaupun beberapa keperluan pemformatan sedikit berbeza. Ini akan meningkatkan pemahaman anda tentang ungkapan biasa, cara menggunakannya, dan cara menerapkannya dalam pelbagai situasi dan bahasa pengekodan. Sebaik sahaja anda menjadi pakar regex, garis kecil perbezaan antara alat dan bahasa pengaturcaraan biasanya memudar, dan anda akan cenderung untuk mengingati keperluan sintaks khusus untuk setiap bahasa atau alat yang anda bekerja di/.
Nikmati!
Tutorial Linux Berkaitan:
- Advanced Bash Regex dengan contoh
- Perkara yang hendak dipasang di Ubuntu 20.04
- Ungkapan biasa python dengan contoh
- Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
- Pengenalan kepada Automasi, Alat dan Teknik Linux
- Manipulasi data besar untuk keseronokan dan keuntungan bahagian 3
- Manipulasi data besar untuk keseronokan dan keuntungan bahagian 1
- Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..
- Perkara yang perlu dipasang di Ubuntu 22.04
- Idiom pemboleh ubah yang maju untuk kepekaan kes ..