Cara Memeriksa Apakah String Berisi Substring di Bash

How Check If String Contains Substring Bash



Pertanyaannya adalah, bagaimana cara memeriksa apakah string berisi substring di Bash. Jawabannya adalah: gunakan Pencocokan Pola. Hal ini menimbulkan pertanyaan lain, yaitu: apa itu Pencocokan Pola? Nah, sebuah frase dalam sebuah kalimat memiliki ciri-ciri tertentu. Itulah sebabnya ia berbeda dengan frasa lain dalam kalimat yang sama atau dalam kalimat lain. Karakteristik dapat dikodekan sebagai pola. Dengan cara itu, frasa tertentu dalam sebuah string dapat diidentifikasi. Artikel ini menjelaskan cara mengidentifikasi substring tertentu dalam string yang lebih besar, mengganti substring yang cocok dengan substring lain, dan menemukan substring apa pun dalam string yang lebih besar menurut indeks. Namun, sebelum menyelami penjelasannya, kita harus mengingat berbagai cara string dibuat di Bash.

String dengan Escapes Spaces

Sebuah string dapat dibangun dengan mengganti setiap spasi dengan urutan escape spasi, ' '; seperti dalam:







myVar=Pariwisatadi dalam Mesir adalah salah satu dari negaranya 's terkemuka ekonomi industri.
dibuang $myVar

Outputnya adalah:



Pariwisata di Mesir adalah salah satu industri ekonomi terkemuka di negara itu.



Catatan: apostrof juga menggunakan urutan keluar ruang.





String oleh Kutipan Tunggal

Apakah programmer punya waktu untuk keluar dari semua spasi dalam sebuah string? Tidak. Oleh karena itu, lebih baik menggunakan dua tanda kutip tunggal untuk membatasi string; seperti:

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

String yang dikutip tunggal tidak memungkinkan ekspansi (menggantikan dengan efeknya) dari urutan escape apa pun. Untungnya, jika dua string dikodekan di samping satu sama lain, mereka akan dianggap sebagai satu string. Urutan pelarian dapat dimasukkan di antara, seperti yang dilakukan di atas. Urutan pelarian akan diperluas. Sehingga outputnya menjadi:



Pariwisata di Mesir adalah salah satu industri ekonomi terkemuka di negara itu.

String dengan Kutipan Ganda

Dengan tanda kutip ganda, urutan escape tidak diperluas juga, tetapi variabel diperluas. Kode berikut menggambarkan hal ini:

myVar=Pariwisatadi dalam Mesir adalah salah satu dari negaranya 's terkemuka ekonomi industri.
dibuang $myVar

Outputnya adalah:

Pariwisata di Mesir adalah salah satu industri ekonomi terkemuka di negara itu.

Catatan: apostrof juga menggunakan urutan keluar ruang.

Dalam artikel ini, jenis utama string yang dipertimbangkan adalah string dalam tanda kutip tunggal.

Dasar-dasar Ekspresi Reguler

ekspresi reguler

Pertimbangkan string ini:

Dunia ini sebenarnya bukan rumah kita.

Biarkan dunia menjadi substring yang menarik. Kemudian, string besar (seluruh string) disebut string target atau secara sederhana, target. 'Dunia' dalam tanda kutip disebut ekspresi reguler atau sederhananya, regex. Konten, dunia, adalah polanya, dalam hal ini.

Pencocokan Sederhana

Dalam kode berikut, jika kata 'dunia' ditemukan di target, kami akan mengatakan kata telah dicocokkan.

P='Dunia ini bukan benar-benar rumah kita.'
reg='dunia'
jika [[ $ str= ~$reg ]];kemudian
dibuangditemukan
lain
dibuangtidak ditemukan
menjadi

=~ , yang merupakan operator penugasan diikuti oleh ~ , disebut operator pengikatan. Kondisi memeriksa apakah pola cocok dengan string target. Jika substring yang sesuai dengan pola ditemukan di target, pernyataan gema akan ditampilkan. Jika tidak ditemukan, pernyataan gema gema tidak ditemukan. Output untuk kode ini adalah:

ditemukan

Sebagai pola, dunia, ditemukan dalam target. Perhatikan bahwa spasi pembatas setelah [[ dan sebelum ]] telah dipertahankan.

Pola

Dalam kode di atas, 'dunia' dalam tanda kutip adalah regex sedangkan dunia itu sendiri adalah polanya. Ini adalah pola langsung. Namun, kebanyakan pola tidak sesederhana itu. Pola adalah karakterisasi dari substring yang akan ditemukan. Jadi, pola Bash menggunakan metakarakter tertentu. Metacharacter adalah karakter tentang karakter lain. Sebagai contoh, Bash Pattern menggunakan metakarakter berikut:

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

Ekspresi reguler juga dapat diketik dalam kondisi tanda kurung ganda. Tapi itu tidak harus dalam tanda kutip. Jadi, dalam hal ini, secara harfiah, sebuah pola.

Kelas Karakter

Kurung Persegi

Output dari kode berikut ditemukan, artinya terjadi kecocokan:

P='Kucing itu masuk ke kamar.'
jika [[ $ str= ~[cbr]pada]];kemudian
dibuangditemukan
menjadi

Pola, [cbr]at memiliki kecocokan cat, yang dimulai dengan 'c', dan berlanjut dan diakhiri dengan at. [cbr]at berarti, cocok dengan 'c' atau 'b' atau 'r' diikuti dengan at.

Output dari kode berikut ditemukan, artinya terjadi kecocokan:

P='Kelelawar masuk ke kamar.'
jika [[ $ str= ~[cbr]pada]];kemudian
dibuangditemukan
menjadi

Pola, [cbr]at memiliki bat yang cocok, yang dimulai dengan 'b', dan yang berlanjut dan diakhiri dengan at. [cbr]at berarti, cocok dengan 'c' atau 'b' atau 'r' diikuti dengan at.

Output dari kode berikut ditemukan, artinya terjadi kecocokan:

P='Tikus itu masuk ke kamar.'
jika [[ $ str= ~[cbr]pada]];kemudian
dibuangditemukan
menjadi

Pola, [cbr]at memiliki kecocokan tikus, yang dimulai dengan 'r', dan yang berlanjut dan diakhiri dengan di.

Dalam contoh kode di atas, pemrogram tidak tahu apakah kucing atau kelelawar atau tikus ada di string target. Tapi, dia tahu bahwa substring dimulai dengan 'c' atau 'b' atau 'r', kemudian berlanjut dan diakhiri dengan di. Tanda kurung siku dalam suatu pola memungkinkan kemungkinan karakter yang berbeda untuk mencocokkan satu karakter pada posisi relatif terhadap karakter lain dalam target. Jadi, tanda kurung siku berisi sekumpulan karakter, yang salah satunya cocok untuk substring. Akhirnya, substring lengkap yang cocok.

Rentang Karakter

Dalam kode di atas [cbr] adalah sebuah kelas. Bahkan jika 'c' atau 'b' atau 'r' sesuai dengan satu karakter, jika pada saat itu segera tidak cocok, polanya tidak akan cocok dengan apa pun.

Nah, ada rentang tertentu yang akan membentuk kelas. Misalnya, 0 hingga 9 digit membentuk kelas, [0-9] dengan 0 dan 9 disertakan. Huruf kecil 'a' hingga 'z' membentuk kelas [a-z] dengan menyertakan 'a' dan 'z'. Huruf besar 'A' hingga 'Z' membentuk kelas [A-Z] dengan 'A' dan 'Z' disertakan. Dari sebuah kelas, itu adalah salah satu karakter yang akan cocok dengan satu karakter dalam string.

Kode berikut menghasilkan kecocokan:

jika [[ 'ID8id'= ~[0-9] ]];kemudian
dibuangditemukan
menjadi

Kali ini targetnya adalah string literal dalam kondisi. 8, yang merupakan salah satu angka yang mungkin dalam rentang, [0-9], telah cocok dengan 8 dalam string, 'ID8id'. Kode di atas setara dengan:

jika [[ 'ID8id'= ~[0123456789] ]];kemudian
dibuangditemukan
menjadi

Di sini, semua angka yang mungkin telah ditulis dalam pola, jadi tidak ada tanda hubung.

Dalam kode berikut, kecocokan diperoleh:

jika [[ 'ID8iD'= ~[a-z] ]];kemudian
dibuangditemukan
menjadi

Kecocokan adalah antara huruf kecil 'i' dari rentang, [a-z], dan huruf kecil 'i' dari string target, 'ID8iD'.

Ingat: rentang adalah kelas. Kelas dapat menjadi bagian dari pola yang lebih besar. Jadi dalam sebuah pola, teks bisa berada di depan dan/atau setelah kelas. Kode berikut menggambarkan hal ini:

jika [[ 'ID8id adalah pengidentifikasi'=~ ID[0-9]Indo ]];kemudian
dibuangditemukan
menjadi

Outputnya adalah: ditemukan. 'ID8id' dari pola telah cocok dengan 'ID8id' di string target.

Penyangkalan

Pencocokan tidak diperoleh dari kode berikut:

jika [[ '0123456789101122'= ~[^0-9] ]];kemudian
dibuangditemukan
lain
dibuangtidak ditemukan
menjadi

Outputnya adalah:

tidak ditemukan

Tanpa ^ di depan rentang, di dalam tanda kurung siku, nol rentang akan cocok dengan nol pertama dari string target. Jadi, ^ di depan rentang (atau karakter opsional) meniadakan kelas.

Kode berikut menghasilkan kecocokan karena kondisinya berbunyi: cocokkan dengan karakter non-digit mana pun di target:

jika [[ 'ABCDEFGHIJ'= ~[^0-9] ]];kemudian
dibuangditemukan
lain
dibuangtidak ditemukan
menjadi

Jadi hasilnya adalah: ditemukan .

[^0-9] berarti bukan angka, jadi [^0-9] adalah negasi dari [0-9] .

[^a-z] berarti bukan huruf kecil, jadi [^a-z] adalah negasi dari [a-z] .

[^A-Z] berarti bukan huruf besar, jadi [^A-Z] adalah negasi dari [A-Z] .

Negasi lain tersedia.

Periode (.) dalam Pola

Titik (.) dalam pola cocok dengan karakter apa pun termasuk karakter itu sendiri. Perhatikan kode berikut:

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

Keluaran kode ditemukan karena karakter lain cocok. Satu titik cocok dengan '5'; titik lain cocok dengan 'X'; dan titik terakhir cocok dengan titik.

Pencocokan Alternatif

Pertimbangkan kalimat ini untuk string target:

Sangkar memiliki burung dari berbagai jenis.

Seseorang mungkin ingin tahu apakah target ini memiliki merpati atau merak atau elang. Kode berikut dapat digunakan:

P='Sangkar memiliki burung merak dari berbagai jenis.'
jika [[ $ str=~ merpati|merak|burung rajawali]];kemudian
dibuangditemukan
lain
dibuangtidak ditemukan
menjadi

Outputnya adalah, ditemukan. Metakarakter bergantian, | telah dipekerjakan. Bisa ada dua, tiga, empat dan lebih banyak alternatif. Yang cocok dengan kode ini adalah 'merak'.

Pengelompokan

Dalam pola berikut, tanda kurung telah digunakan untuk mengelompokkan karakter:

panggung (penari)

Kelompok di sini adalah penari panggung yang dikelilingi oleh metakarakter (dan). (penari) adalah subkelompok, sedangkan panggung (penari) adalah seluruh kelompok. Pertimbangkan hal berikut:

(penarinya luar biasa)

Di sini, subgrup atau substring adalah, penarinya luar biasa.

Substring dengan Bagian Umum

Stakeholder adalah orang yang berkepentingan dengan bisnis. Bayangkan sebuah bisnis dengan situs web, stake.com. Bayangkan salah satu dari string target berikut ada di komputer:

Situs web, stake.com adalah untuk bisnis.;

Ada pemangku kepentingan.;

Pemangku kepentingan bekerja untuk stake.com.;

Biarkan salah satu dari string ini menjadi target. Pemrogram mungkin ingin tahu apakah stake.com atau pemangku kepentingan ada dalam string target apa pun. Polanya akan menjadi:

stake.com|stakeholder

menggunakan pergantian.

pasak telah diketik dua kali dalam dua kata. Hal ini dapat dihindari dengan mengetikkan pola sebagai berikut:

pasak(.com|pemegang)

.com|holder adalah subgrup dalam kasus ini.

Catatan: penggunaan karakter pergantian dalam hal ini. stake.com atau stakeholder akan tetap dicari. Output dari kode berikut ditemukan:

P='Situs web, stake.com adalah untuk bisnis.'
jika [[ $ str=~ taruhan(.dengan|pemegang) ]];kemudian
dibuangditemukan
menjadi

Substring yang cocok di sini adalah stake.com.

Array Standar BASH_REMATCH

BASH_REMATCH adalah larik yang telah ditentukan sebelumnya. Asumsikan bahwa suatu pola memiliki grup. Seluruh grup cocok, masuk ke sel untuk indeks 0 dari array ini. Subkelompok pertama cocok, masuk ke sel untuk indeks 1; subkelompok kedua cocok, masuk ke sel untuk indeks 2, dan seterusnya. Kode berikut menunjukkan cara menggunakan array ini:

P='Penari panggung telah datang.'
jika [[ $ str=~ panggung(penari) ]];kemudian
dibuangditemukan
menjadi

untukSayadi dalam ${!BASH_REMATCH[@]};melakukan
printf '${BASH_REMATCH[i]}, '
selesai
dibuang

Outputnya adalah:

ditemukan
penari panggung, penari,

Seluruh kelompok adalah penari panggung. Hanya ada satu subkelompok, yaitu penari.

Catatan: ruang dalam pola telah diloloskan.

Pencocokan Independensi Huruf Besar / Kecil

Pencocokan, seperti yang dijelaskan di atas, peka terhadap huruf besar-kecil. Pencocokan dapat dilakukan secara independen dari kasus ini. Ini diilustrasikan dalam kode berikut:

toko-toko -Stidak cocok

P='Kami menyukai musik yang bagus.'
jika [[ $ str=~ Bagus]];kemudian
dibuangditemukan
menjadi

toko-toko -utidak cocok

Outputnya adalah: ditemukan. Polanya, Bagus. Substring yang cocok adalah 'baik'. Perhatikan bagaimana opsi nocasematch telah diaktifkan di awal segmen kode dan dinonaktifkan di akhir segmen kode.

Panjang sebuah String

Sintaks untuk mendapatkan panjang string adalah:

${#PARAMETER}

Contoh:

P='Kami menyukai musik yang bagus.'
dibuang $ {# str}

Keluarannya adalah: 19.

Pengurangan Tali

Sintaks untuk reduksi string adalah:

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

dimana penghitungan OFFSET dimulai dari nol.

Contoh berikut menunjukkan cara menghapus 11 karakter pertama dari sebuah string:

P='Saya selalu menari dengan musik yang bagus.'
dibuang $ {str: 10}

Outputnya adalah:

menyukai musik yang bagus.

Menghitung LENGTH, dimulai dari karakter berikutnya. Kode berikut menunjukkan bagaimana bagian dalam string dapat diizinkan:

P='Saya selalu menari dengan musik yang bagus.'
dibuang $ {str: 10: 6}

Outputnya adalah:

selamat datang

11 karakter pertama telah dihapus; 6 karakter berikutnya diizinkan, dan karakter lainnya dihapus secara otomatis.

Cari dan Ganti

Ketika substring ditemukan, itu dapat diganti dengan substring lain. Sintaks untuk ini adalah:

di mana=${PARAMETER/PATTERN/REPLACEMENT}
di mana=${PARAMETER//PATTERN/REPLACEMENT}
di mana=${PARAMETER/POLA}
di mana=${PARAMETER//PATTERN}

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

P='Ada tikus, kelelawar dan kucing, di dalam kamar.'
Baik=${str/[cbr]at/sapi besar}
dibuang $ str
dibuang $ ret

Outputnya adalah:

Ada tikus, kelelawar, dan kucing, di dalam kamar.
Ada sapi besar, kelelawar dan kucing, di dalam kamar.

Untuk sintaks kedua dengan garis miring ganda, semua kemunculan yang cocok akan diganti. Contoh:

P='Ada tikus, kelelawar dan kucing, di dalam kamar.'
Baik=${str//[cbr]at/sapi besar}
dibuang $ str
dibuang $ ret

Outputnya adalah:

Ada tikus, kelelawar, dan kucing, di dalam kamar.
Ada sapi besar, sapi besar dan sapi besar, di dalam kamar.

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

Juga, substring pertama yang ditemukan akan dihapus. Contoh:

P='Ada tikus, kelelawar dan kucing, di dalam kamar.'
Baik=${str/[cbr]at}
dibuang $ str
dibuang $ ret

Untuk sintaks keempat dengan garis miring ganda, tidak ada pengganti untuk semua kecocokan. Juga, semua substring yang ditemukan akan dihapus. Contoh:

P='Ada tikus, kelelawar dan kucing, di dalam kamar.'
Baik=${str//[cbr]at}
dibuang $ str
dibuang $ ret

Outputnya adalah:

Ada tikus, kelelawar, dan kucing, di dalam kamar.
Ada , a dan a , di dalam ruangan.

Kesimpulan

Untuk memeriksa apakah string memiliki substring di Bash, Pencocokan Pola harus digunakan. Pencocokan Pola tidak hanya berlangsung dalam kondisi tanda kurung ganda, [[ . . . ]]. Itu juga dapat terjadi dalam ekspansi parameter, dengan ${. . .}. Dengan ekspansi parameter, dimungkinkan untuk mendapatkan substring dengan indeks.

Apa yang telah disajikan dalam artikel ini adalah poin paling kritis dalam Pencocokan Pola. Masih ada lagi! Namun, apa yang pembaca harus pelajari selanjutnya, adalah Ekspansi Nama File.