Cara Memeriksa Jika String Mengandungi Substring di Bash

How Check If String Contains Substring Bash



Persoalannya, bagaimana untuk memeriksa apakah rentetan mengandungi substring di Bash. Jawapannya: gunakan Matching Pattern. Ini menimbulkan persoalan lain, iaitu: apakah Pencocokan Pola? Nah, frasa dalam ayat mempunyai ciri-ciri tertentu. Itulah sebabnya ia berbeza dengan frasa lain dalam ayat yang sama atau dalam ayat lain. Ciri-ciri boleh dikodkan sebagai corak. Dengan cara itu, frasa tertentu dalam rentetan dapat dikenal pasti. Artikel ini menerangkan cara mengenal pasti substring tertentu dalam rentetan yang lebih besar, mengganti substring yang dipadankan dengan substring lain, dan mencari substring dalam rentetan yang lebih besar mengikut indeks. Namun, sebelum menyelidiki penjelasannya, seseorang harus mengingat kembali cara-cara yang berbeza yang dibuat tali di Bash.

Rentetan dengan Melarikan Ruang

Rentetan dapat dibina dengan menggantikan setiap ruang dengan urutan pelarian ruang, ''; seperti dalam:







myVar= Pelancongan dalam Mesir adalah satu dari negara 'industri terkemuka ekonomi .
membuang $ myVar

Keluarannya adalah:



Pelancongan di Mesir adalah salah satu industri ekonomi terkemuka di negara ini.



Catatan: apostrof juga menggunakan urutan pelarian ruang.





Rentetan dengan Petikan Tunggal

Adakah pengaturcara mempunyai waktu untuk melepaskan diri dari semua ruang dalam rentetan? Tidak. Oleh itu, menggunakan dua tanda petik tunggal untuk membatasi rentetan adalah lebih baik; seperti:

myVar='Pelancongan di Mesir adalah salah satu negara' 'industri ekonomi terkemuka. '

Rentetan sebut harga tunggal tidak membenarkan pengembangan (menggantikan dengan kesannya) sebarang urutan pelarian. Nasib baik, jika dua rentetan dikodkan di sebelah satu sama lain, mereka akan diambil sebagai satu tali. Urutan melarikan diri dapat dimasukkan di antara, seperti yang dilakukan di atas. Urutan melarikan diri akan diperluas. Jadi output menjadi:



Pelancongan di Mesir adalah salah satu industri ekonomi terkemuka di negara ini.

Rentetan dengan Petikan Berganda

Dengan petikan berganda, urutan pelarian tidak diperluas juga, tetapi pemboleh ubah diperluas. Kod berikut menggambarkan ini:

myVar= Pelancongan dalam Mesir adalah satu dari negara 'industri terkemuka ekonomi .
membuang $ myVar

Keluarannya adalah:

Pelancongan di Mesir adalah salah satu industri ekonomi terkemuka di negara ini.

Catatan: apostrof juga menggunakan urutan pelarian ruang.

Dalam artikel ini, jenis rentetan utama yang dipertimbangkan adalah rentetan dalam petikan tunggal.

Asas Ekspresi Biasa

Regex

Pertimbangkan rentetan ini:

Dunia ini sebenarnya bukan rumah kita.

Biarkan dunia menjadi tarikan utama. Kemudian, tali besar (utas utuh) disebut rentetan sasaran atau sekadar sasaran. ‘Dunia’ dalam tanda petik disebut ungkapan biasa atau hanya, regex. Kandungan, dunia, adalah corak, dalam kes ini.

Padanan Mudah

Dalam kod berikut, jika kata 'dunia' dijumpai dalam sasaran, kita akan mengatakan kata tersebut telah dipadankan.

hlm='Dunia ini sebenarnya bukan rumah kita.'
pendaftaran='dunia'
sekiranya [[ $ str= ~$ reg ]];kemudian
membuangdijumpai
yang lain
membuangtidak ditemui
menjadi

= ~, yang merupakan operator penugasan diikuti oleh ~, disebut operator pengikat. Keadaan memeriksa sama ada corak dipadankan dalam rentetan sasaran. Sekiranya substring yang sesuai dengan corak ditemui dalam sasaran, pernyataan echo akan dijumpai. Sekiranya tidak dijumpai, pernyataan gema bergema tidak dijumpai. Keluaran untuk kod ini adalah:

dijumpai

Seperti corak, dunia, terdapat dalam sasaran. Perhatikan bahawa ruang persempadanan setelah [[dan sebelumnya]] telah dikekalkan.

Corak

Dalam kod di atas, 'dunia' dalam tanda petik adalah regex sementara dunia itu sendiri adalah corak. Ini adalah corak berterus terang. Walau bagaimanapun, kebanyakan corak tidak semudah itu. Corak adalah pencirian substring yang dapat dijumpai. Oleh itu, corak Bash menggunakan metakarakter tertentu. Metacharacter adalah watak mengenai watak lain. Sebagai contoh, Bash Pattern menggunakan metacharacters berikut:

^ $ . * +? () [] {} |

Ungkapan biasa juga boleh ditaip dalam tanda kurung berganda. Tetapi tidak semestinya dalam petikan. Jadi, dalam kes ini, secara harfiah, adalah corak.

Kelas Perwatakan

Dalam kurungan

Hasil kod berikut dijumpai, yang bermaksud pertandingan berlaku:

hlm='Kucing itu masuk ke dalam bilik.'
sekiranya [[ $ str= ~[cbr]di]];kemudian
membuangdijumpai
menjadi

Corak, [cbr] at telah memadankan kucing, yang dimulai dengan 'c', dan yang berlanjutan dan berakhir dengan pada. [cbr] pada cara, padankan 'c' atau 'b' atau 'r' diikuti oleh di.

Hasil kod berikut dijumpai, yang bermaksud pertandingan berlaku:

hlm='Kelelawar masuk ke dalam kamar.'
sekiranya [[ $ str= ~[cbr]di]];kemudian
membuangdijumpai
menjadi

Corak, [cbr] at telah dipadankan dengan kelawar, yang dimulai dengan 'b', dan yang berlanjut dan berakhir dengan pada. [cbr] pada cara, padankan 'c' atau 'b' atau 'r' diikuti oleh di.

Hasil kod berikut dijumpai, yang bermaksud pertandingan berlaku:

hlm='Tikus itu masuk ke dalam kamar.'
sekiranya [[ $ str= ~[cbr]di]];kemudian
membuangdijumpai
menjadi

Pola, [cbr] at telah mencocokkan tikus, yang dimulai dengan 'r', dan yang berlanjut dan berakhir dengan pada.

Dalam contoh kod di atas, pengaturcara tidak mengetahui sama ada kucing atau kelawar atau tikus ada dalam rentetan sasaran. Tetapi, dia tahu bahawa substring bermula dengan 'c' atau 'b' atau 'r', kemudian diteruskan dan berakhir dengan pukul. Tanda kurung persegi dalam satu corak membolehkan watak yang berbeza untuk mencocokkan satu watak pada kedudukan berbanding dengan yang lain dalam sasaran. Jadi, tanda kurung persegi mengandungi sekumpulan watak, yang mana satu dipadankan untuk substring. Akhirnya, ia adalah substring lengkap yang dipadankan.

Julat Watak

Dalam kod di atas [cbr] adalah kelas. Walaupun ‘c’ atau ‘b’ atau ‘r’ sesuai dengan satu watak, jika yang berikut langsung tidak sesuai, corak tidak akan sesuai dengan apa-apa.

Nah, ada julat tertentu yang akan membentuk kelas. Contohnya, 0 hingga 9 digit membentuk kelas, [0-9] dengan 0 dan 9 disertakan. Huruf kecil 'a' hingga 'z' membentuk kelas [a-z] dengan 'a' dan 'z' disertakan. Huruf besar ‘A’ hingga ‘Z’ membentuk kelas [A-Z] dengan disertakan ‘A’ dan ‘Z’. Dari kelas, ia adalah salah satu watak yang sesuai dengan satu watak dalam rentetan.

Kod berikut menghasilkan padanan:

sekiranya [[ 'ID8id'= ~[0-9] ]];kemudian
membuangdijumpai
menjadi

Kali ini sasarannya adalah rentetan literal dalam keadaan. 8, yang merupakan salah satu kemungkinan nombor dalam julat, [0-9], telah dipadankan dengan 8 dalam rentetan, 'ID8id'. Kod di atas bersamaan dengan:

sekiranya [[ 'ID8id'= ~[0123456789] ]];kemudian
membuangdijumpai
menjadi

Di sini, semua kemungkinan nombor telah ditulis dalam corak, jadi tidak ada tanda hubung.

Dalam kod berikut, padanan diperoleh:

sekiranya [[ 'ID8iD'= ~[a-z] ]];kemudian
membuangdijumpai
menjadi

Perlawanan antara huruf kecil 'i' dari jarak, [a-z], dan huruf kecil 'i' dari rentetan sasaran, 'ID8iD'.

Ingat: jaraknya adalah kelas. Kelas boleh menjadi sebahagian daripada corak yang lebih besar. Jadi dalam corak, teks boleh berada di depan dan / atau selepas kelas. Kod berikut menggambarkan ini:

sekiranya [[ 'ID8id adalah pengecam'= ~ ID[0-9]ID ]];kemudian
membuangdijumpai
menjadi

Keluarannya: dijumpai. ‘ID8id’ dari corak telah sesuai dengan ‘ID8id’ pada rentetan sasaran.

Penafian

Pencocokan tidak diperoleh dari kod berikut:

sekiranya [[ '0123456789101112'= ~[^0-9] ]];kemudian
membuangdijumpai
yang lain
membuangtidak ditemui
menjadi

Keluarannya adalah:

tidak ditemui

Tanpa ^ di depan rentang, dalam kurungan siku, sifar julat akan sama dengan sifar pertama dari rentetan sasaran. Jadi, ^ di hadapan julat (atau watak pilihan) menafikan kelas.

Kod berikut menghasilkan padanan kerana keadaannya berbunyi: padankan watak bukan digit di mana sahaja dalam sasaran:

sekiranya [[ 'ABCDEFGHIJ'= ~[^0-9] ]];kemudian
membuangdijumpai
yang lain
membuangtidak ditemui
menjadi

Jadi outputnya: dijumpai.

[^ 0-9] bermaksud bukan digit, jadi [^ 0-9] adalah penolakan [0-9].

[^ a-z] bermaksud huruf bukan huruf kecil, jadi [^ a-z] adalah penolakan [a-z].

[^ A-Z] bermaksud huruf bukan huruf besar, jadi [^ A-Z] adalah penolakan [A-Z].

Negasi lain ada.

Tempoh (.) Dalam Corak

Tempoh (.) Dalam corak sepadan dengan watak termasuk dirinya. Pertimbangkan kod berikut:

sekiranya [[ '6759WXY.A3'= ~ 7.9W.Y.A]];kemudian
membuangdijumpai
menjadi

Hasil kod dijumpai kerana watak-watak lain sepadan. Satu titik sepadan dengan ‘5’; titik lain sepadan dengan 'X'; dan titik terakhir sepadan dengan titik.

Alternatif yang sepadan

Pertimbangkan ayat ini untuk rentetan sasaran:

Kandang mempunyai pelbagai jenis burung.

Seseorang mungkin ingin mengetahui apakah sasaran ini mempunyai merpati atau merak atau helang. Kod berikut boleh digunakan:

hlm='Kandang itu mempunyai merak dari pelbagai jenis.'
sekiranya [[ $ str= ~ merpati|burung merak|helang]];kemudian
membuangdijumpai
yang lain
membuangtidak ditemui
menjadi

Hasilnya dijumpai. Metakarakter penggantian, | telah diambil bekerja. Terdapat dua, tiga, empat dan lebih banyak alternatif. Yang sesuai dalam kod ini adalah 'merak'.

Pengumpulan

Dalam corak berikut, tanda kurung telah digunakan untuk mengelompokkan watak:

pentas (penari)

Kumpulan di sini adalah penari panggung yang dikelilingi oleh watak-watak metacharacters (dan). (penari) adalah subkumpulan, sementara pentas (penari) adalah keseluruhan kumpulan. Pertimbangkan perkara berikut:

(Penari itu hebat)

Di sini, subkumpulan atau substring adalah, penari sangat mengagumkan.

Substring dengan Bahagian Biasa

Pemangku kepentingan adalah orang yang berminat dalam perniagaan. Bayangkan perniagaan dengan laman web, stake.com. Bayangkan bahawa salah satu rentetan sasaran berikut ada di komputer:

Laman web, stake.com adalah untuk perniagaan .;

Ada pihak berkepentingan .;

Pemangku kepentingan bekerja untuk stake.com .;

Biarkan mana-mana rentetan ini menjadi sasaran. Pengaturcara mungkin ingin mengetahui apakah stake.com atau pihak berkepentingan berada dalam rentetan sasaran apa pun. Coraknya adalah:

stake.com | pemegang kepentingan

menggunakan gantian.

taruhan telah ditaip dua kali dalam dua perkataan. Ini dapat dielakkan dengan menaip corak seperti berikut:

pegangan (.com | pemegang)

pemegang | adalah subkumpulan dalam kes ini.

Catatan: penggunaan watak gantian dalam kes ini. stake.com atau pemegang kepentingan masih akan dicari. Hasil kod berikut dijumpai:

hlm='Laman web, stake.com adalah untuk perniagaan.'
sekiranya [[ $ str= ~ pegangan(.dengan|pemegang) ]];kemudian
membuangdijumpai
menjadi

Substring yang dipadankan di sini adalah stake.com.

Array Pratakrif BASH_REMATCH

BASH_REMATCH adalah tatasusunan yang telah ditentukan. Andaikan bahawa corak mempunyai kumpulan. Seluruh kumpulan dipadankan, masuk ke sel untuk indeks 0 array ini. Subkumpulan pertama dipadankan, masuk ke sel untuk indeks 1; subkumpulan kedua dipadankan, masuk ke sel untuk indeks 2, dan seterusnya. Kod berikut menunjukkan cara menggunakan susunan ini:

hlm='Penari panggung telah datang.'
sekiranya [[ $ str= ~ pentas (penari) ]];kemudian
membuangdijumpai
menjadi

untukidalam $ {! BASH_REMATCH [@]};buat
printf '$ {BASH_REMATCH [i]}, '
selesai
membuang

Keluarannya adalah:

dijumpai
penari pentas, penari,

Keseluruhan kumpulan adalah penari pentas. Hanya ada satu subkumpulan, iaitu penari.

Catatan: ruang dalam corak telah dilarikan.

Pencocokan Kemerdekaan Huruf Atas / Bawah

Memadankan, seperti yang dijelaskan di atas, peka huruf besar kecil. Pencocokan boleh dilakukan secara bebas dari kes. Ini digambarkan dalam kod berikut:

kedai -spertandingan nocasem

hlm='Kami suka muzik yang bagus.'
sekiranya [[ $ str= ~ GoOd]];kemudian
membuangdijumpai
menjadi

kedai -upertandingan nocasem

Keluarannya: dijumpai. Coraknya adalah, GoOd. Substring yang dipadankan adalah 'bagus'. Perhatikan bagaimana pilihan nocasematch telah diaktifkan pada awal segmen kod dan dilumpuhkan pada akhir segmen kod.

Panjang tali

Sintaks untuk memperoleh panjang tali ialah:

$ {# PARAMETER}

Contoh:

hlm='Kami suka muzik yang bagus.'
membuang $ {# str}

Keluarannya adalah: 19.

Pengurangan tali

Sintaks untuk pengurangan rentetan adalah:

$ {PARAMETER: OFFSET}
$ {PARAMETER: OFFSET: LENGTH}

di mana pengiraan untuk OFFSET bermula dari sifar.

Contoh berikut menunjukkan cara membuang 11 aksara rentetan pertama:

hlm='Saya selalu menari dengan muzik yang bagus.'
membuang $ {str: 10}

Keluarannya adalah:

lagu untuk muzik yang bagus.

Mengira untuk PANJANG, bermula dari watak seterusnya. Kod berikut menunjukkan bagaimana bahagian dalam tali boleh dibenarkan:

hlm='Saya selalu menari dengan muzik yang bagus.'
membuang $ {str: 10: 6}

Keluarannya adalah:

ance t

11 watak pertama dikeluarkan; 6 watak seterusnya dibenarkan, dan selebihnya watak dikeluarkan secara automatik.

Cari dan Ganti

Apabila substring dijumpai, substring dapat diganti dengan substring yang lain. Sintaks untuk ini adalah:

di mana=$ {PARAMETER / POLA / PENGGANTIAN}
di mana=$ {PARAMETER // POLA / PENGGANTIAN}
di mana=$ {PARAMETER / POLA}
di mana=$ {PARAMETER // POLA}

Untuk sintaks pertama dengan garis miring tunggal, hanya perlawanan pertama yang diganti. Contoh:

hlm='Ada tikus, kelelawar dan kucing, di dalam kamar.'
betul=$ {str / [cbr] di / lembu besar}
membuang $ str
membuang $ ret

Keluarannya adalah:

Ada tikus, kelelawar dan kucing, di dalam bilik.
Terdapat seekor lembu besar, kelelawar dan kucing, di dalam bilik.

Untuk sintaks kedua dengan garis miring ke depan, semua kejadian pertandingan diganti. Contoh:

hlm='Ada tikus, kelelawar dan kucing, di dalam kamar.'
betul=$ {str // [cbr] di / lembu besar}
membuang $ str
membuang $ ret

Keluarannya adalah:

Ada tikus, kelelawar dan kucing, di dalam bilik.
Terdapat lembu besar, lembu besar dan lembu besar, di dalam bilik.

Untuk sintaks ketiga dengan garis miring tunggal, tidak ada penggantian untuk pertandingan pertama dan satu-satunya.

Substring pertama yang dijumpai juga dipadamkan. Contoh:

hlm='Ada tikus, kelelawar dan kucing, di dalam kamar.'
betul=$ {str / [cbr] pada}
membuang $ str
membuang $ ret

Untuk sintaks keempat dengan garis miring ke depan, tidak ada pengganti untuk semua perlawanan. Juga, semua substring yang dijumpai akan dipadamkan. Contoh:

hlm='Ada tikus, kelelawar dan kucing, di dalam kamar.'
betul=$ {str // [cbr] pada}
membuang $ str
membuang $ ret

Keluarannya adalah:

Ada tikus, kelelawar dan kucing, di dalam bilik.
Terdapat a, a dan a, di ruang.

Kesimpulannya

Untuk memeriksa apakah string mempunyai substring di Bash, Matching Pattern harus digunakan. Padankan Corak tidak hanya berlaku dalam kurungan berganda, [[. . . ]]. Ini juga dapat berlaku dalam pengembangan parameter, dengan $ {. . .}. Dengan pengembangan parameter, adalah mungkin untuk mendapatkan substring oleh indeks.

Apa yang telah dibentangkan dalam artikel ini adalah poin yang paling penting dalam Pencocokan Corak. Terdapat banyak lagi! Namun, apa yang harus dikaji oleh pembaca seterusnya, adalah Pengembangan Nama Fail.