Bash'de Bir Dizenin Alt Dize İçerip İçermediği Nasıl Kontrol Edilir

How Check If String Contains Substring Bash



Soru, bir dizenin Bash'de bir alt dize içerip içermediğinin nasıl kontrol edileceğidir. Cevap şudur: Model Eşleştirmeyi kullanın. Bu, başka bir soruya yol açar: Model Eşleştirme nedir? Eh, bir cümledeki bir ifadenin belirli özellikleri vardır. Bu nedenle aynı cümledeki veya diğer cümlelerdeki diğer tamlamalardan farklıdır. Karakteristikler bir model olarak kodlanabilir. Bu şekilde, bir dizideki belirli bir ifade tanımlanabilir. Bu makale, daha büyük bir dizede belirli bir alt dizenin nasıl tanımlanacağını, eşleşen alt dizenin başka bir alt dizeyle nasıl değiştirileceğini ve daha büyük bir dizedeki herhangi bir alt dizenin dizine göre nasıl bulunacağını açıklar. Bununla birlikte, açıklamalara dalmadan önce, Bash'de bir dizi oluşturmanın farklı yollarını hatırlamak gerekir.

Kaçan Boşluklarla Dize

Her boşluğu boşluktan kaçış dizisi '' ile değiştirerek bir dize oluşturulabilir; de olduğu gibi:







myVar=Turizmiçinde Mısır ülkeden bir 's lider ekonomik endüstriler.
dışarı attı $myVar

Çıktı:



Mısır'da turizm, ülkenin önde gelen ekonomik endüstrilerinden biridir.



Not: kesme işareti ayrıca boşluktan kaçış dizisini de kullandı.





Tek Tırnaklı Dize

Programcının bir dizgedeki tüm boşluklardan kaçmak için zamanı var mı? Hayır. Bu nedenle, bir dizeyi sınırlandırmak için iki tek tırnak kullanmak daha iyidir; gibi:

myVar='Mısır'da Turizm Ülkelerinden Biri' ''önde gelen ekonomik endüstriler.'

Tek tırnaklı bir dize, herhangi bir kaçış dizisinin genişletilmesine (etkisiyle değiştirilmesine) izin vermez. Neyse ki, iki dize yan yana kodlanırsa, bunlar bir dize olarak alınacaktır. Yukarıda yapıldığı gibi aralarına bir kaçış dizisi eklenebilir. Kaçış dizisi genişletilecektir. Böylece çıktı şöyle olur:



Mısır'da turizm, ülkenin önde gelen ekonomik endüstrilerinden biridir.

Çift Tırnaklı Dize

Çift tırnak ile kaçış dizileri de genişletilmez, ancak değişkenler genişletilir. Aşağıdaki kod bunu göstermektedir:

myVar=Turizmiçinde Mısır ülkeden bir 's lider ekonomik endüstriler.
dışarı attı $myVar

Çıktı:

Mısır'da turizm, ülkenin önde gelen ekonomik endüstrilerinden biridir.

Not: kesme işareti ayrıca boşluktan kaçış dizisini de kullandı.

Bu makalede, ele alınan ana dize türü, tek tırnak içindeki dizedir.

Normal İfade Temelleri

normal ifade

Bu dizeyi düşünün:

Bu dünya aslında bizim evimiz değil.

Dünya, ilginin alt dizisi olsun. Daha sonra, büyük dizgeye (bütün dizgi) hedef dizge veya basitçe hedef denir. Tırnak içindeki 'dünya', normal ifade veya basitçe regex olarak adlandırılır. İçerik, dünya, bu durumda kalıptır.

Basit Eşleştirme

Aşağıdaki kodda, hedefte 'world' kelimesi bulunursa, kelimenin eşleştiğini söyleriz.

P='Bu dünya gerçekten bizim evimiz değil.'
kayıt='Dünya'
Eğer [[ $ str= ~$reg ]];sonra
dışarı attıbulundu
Başka
dışarı attıbulunamadı
olmak

Atama operatörü olan ve ardından ~ gelen =~ , bağlama operatörü olarak adlandırılır. Koşul, kalıbın hedef dizede eşleşip eşleşmediğini kontrol eder. Hedefte kalıba karşılık gelen bir alt dize bulunursa, yankı ifadesi bulundu görüntülenir. Bulunamazsa, yankı ifadesi bulunamadı. Bu kodun çıktısı:

bulundu

Kalıp olarak dünya, hedefte bulunur. [[ ve ]]'den sonraki sınırlayıcı boşluğun korunduğuna dikkat edin.

Desen

Yukarıdaki kodda, tırnak içindeki 'dünya' regex iken dünyanın kendisi kalıptır. Bu basit bir kalıptır. Ancak, çoğu desen o kadar basit değildir. Bir model, bulunacak bir alt dizinin karakterizasyonudur. Ve böylece, Bash deseni belirli meta karakterleri kullanır. Meta karakter, diğer karakterlerle ilgili bir karakterdir. Örnek olarak, Bash Pattern aşağıdaki meta karakterleri kullanır:

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

Normal bir ifade, çift parantez koşulunda da yazılabilir. Ama tırnak içinde olmak zorunda değil. Yani, bu durumda, kelimenin tam anlamıyla bir kalıptır.

Karakter Sınıfları

Köşeli parantez

Aşağıdaki kodun çıktısı bulunur, yani bir eşleşme gerçekleşir:

P='Kedi odaya geldi.'
Eğer [[ $ str= ~[cbr]NS]];sonra
dışarı attıbulundu
olmak

[cbr]at modeli, 'c' ile başlayan ve devam edip at ile biten kedi ile eşleşti. [cbr]at, 'c' veya 'b' veya 'r' ile ardından at ile eşleşir.

Aşağıdaki kodun çıktısı bulunur, yani bir eşleşme gerçekleşir:

P='Yarasa odaya girdi.'
Eğer [[ $ str= ~[cbr]NS]];sonra
dışarı attıbulundu
olmak

[cbr]at modeli, 'b' ile başlayan ve at ile devam eden ve biten yarasa ile eşleşti. [cbr]at, 'c' veya 'b' veya 'r' ile ardından at ile eşleşir.

Aşağıdaki kodun çıktısı bulunur, yani bir eşleşme gerçekleşir:

P='Sıçan odaya girdi.'
Eğer [[ $ str= ~[cbr]NS]];sonra
dışarı attıbulundu
olmak

[cbr]at modeli, 'r' ile başlayan ve at ile devam eden ve biten sıçan ile eşleşti.

Yukarıdaki kod örneklerinde programcı, hedef dizide kedi mi yoksa yarasa mı yoksa sıçan mı olduğunu bilmiyor. Ancak, alt dizenin 'c' veya 'b' veya 'r' ile başladığını, sonra devam ettiğini ve at ile bittiğini bilir. Bir desendeki köşeli parantezler, farklı olası karakterlerin hedefteki diğerlerine göre bir konumdaki bir karakterle eşleşmesine izin verir. Bu nedenle, köşeli parantezler, biri bir alt dize için eşleşen bir dizi karakter içerir. Son olarak, eşleşen tam alt dizedir.

Karakter Aralığı

Yukarıdaki kodda [cbr] bir sınıftır. 'c' veya 'b' veya 'r' tek bir karaktere karşılık gelse bile, takip eden hemen eşleşmezse, desen hiçbir şeyle eşleşmeyecektir.

Eh, bir sınıf oluşturacak belirli aralıklar vardır. Örneğin, 0 ila 9 basamak, 0 ve 9 dahil [0-9] sınıfı oluşturur. 'a' ila 'z' arasındaki küçük harf, 'a' ve 'z' dahil olmak üzere [a-z] sınıfını oluşturur. 'A' ila 'Z' arasındaki büyük harf, 'A' ve 'Z' dahil olmak üzere [A-Z] sınıfını oluşturur. Bir sınıftan, dizedeki bir karakterle eşleşen karakterlerden biridir.

Aşağıdaki kod bir eşleşme üretir:

Eğer [[ 'ID8id'= ~[0-9] ]];sonra
dışarı attıbulundu
olmak

Bu sefer hedef, koşuldaki değişmez bir dizedir. [0-9] aralığındaki olası sayılardan biri olan 8, 'ID8id' dizesinde 8 ile eşleşti. Yukarıdaki kod şuna eşdeğerdir:

Eğer [[ 'ID8id'= ~[0123456789] ]];sonra
dışarı attıbulundu
olmak

Burada, olası tüm sayılar desende yazılmıştır, bu nedenle kısa çizgi yoktur.

Aşağıdaki kodda bir eşleşme elde edilir:

Eğer [[ 'ID8iD'= ~[a-z] ]];sonra
dışarı attıbulundu
olmak

Eşleşme, aralığın küçük 'i' harfi, [a-z] ve hedef dizenin 'ID8iD' küçük 'i' harfi arasındadır.

Unutmayın: aralık bir sınıftır. Sınıf daha büyük bir kalıbın parçası olabilir. Yani bir kalıpta metin sınıfın önünde ve/veya arkasında olabilir. Aşağıdaki kod bunu göstermektedir:

Eğer [[ 'ID8id tanımlayıcıdır'=~ kimlik[0-9]İD ]];sonra
dışarı attıbulundu
olmak

Çıktı: bulundu. Kalıptaki 'ID8id', hedef dizedeki 'ID8id' ile eşleşti.

olumsuzlama

Aşağıdaki koddan eşleşme sağlanmaz:

Eğer [[ '0123456789101112'= ~[^0-9] ]];sonra
dışarı attıbulundu
Başka
dışarı attıbulunamadı
olmak

Çıktı:

bulunamadı

Aralığın önünde, köşeli parantezler içinde ^ olmasaydı, aralığın sıfırı, hedef dizenin ilk sıfırıyla eşleşirdi. Bu nedenle, bir aralığın (veya isteğe bağlı karakterlerin) önündeki ^ sınıfı olumsuzlar.

Aşağıdaki kod bir eşleşme üretir, çünkü koşul şunu okur: hedefin herhangi bir yerindeki rakam olmayan herhangi bir karakterle eşleştirin:

Eğer [[ 'ABCDEFGHIJ'= ~[^0-9] ]];sonra
dışarı attıbulundu
Başka
dışarı attıbulunamadı
olmak

Yani çıktı: bulundu.

[^0-9], rakam olmayan anlamına gelir, bu nedenle [^0-9], [0-9] öğesinin olumsuzlamasıdır.

[^a-z] küçük olmayan bir harf anlamına gelir, bu nedenle [^a-z], [a-z] öğesinin olumsuzlamasıdır.

[^A-Z] büyük harf olmayan bir harf anlamına gelir, bu nedenle [^A-Z], [A-Z] öğesinin olumsuzlamasıdır.

Diğer olumsuzluklar mevcuttur.

Kalıptaki Nokta (.)

Desendeki nokta (.), kendisi dahil herhangi bir karakterle eşleşir. Aşağıdaki kodu göz önünde bulundurun:

Eğer [[ '6759WXY.A3'= ~ 7.9W.Y.A]];sonra
dışarı attıbulundu
olmak

Diğer karakterler eşleştiği için kodun çıktısı bulunur. Bir nokta '5' ile eşleşir; başka bir nokta 'X' ile eşleşir; ve son nokta bir noktayla eşleşir.

Eşleşen Değişim

Bir hedef dize için bu cümleyi düşünün:

Kafeste farklı türlerde kuşlar vardır.

Birisi bu hedefte güvercin, tavus kuşu veya kartal olup olmadığını bilmek isteyebilir. Aşağıdaki kod kullanılabilir:

P=Kafeste farklı türlerde tavus kuşları var.
Eğer [[ $ str=~ güvercin|tavuskuşu|Kartal]];sonra
dışarı attıbulundu
Başka
dışarı attıbulunamadı
olmak

Çıktı, bulundu. Dönüşüm meta karakteri, | Istihdam edildi. İki, üç, dört ve daha fazla alternatif olabilir. Bu kodda eşleşen şey 'tavus kuşu'dur.

gruplama

Aşağıdaki modelde, karakterleri gruplamak için parantezler kullanılmıştır:

bir sahne (dansçı)

Buradaki grup, metakarakterlerle ( ve ) çevrili bir sahne dansçısıdır. (dansçı) bir alt gruptur, sahne (dansçı) ise tüm gruptur. Aşağıdakileri göz önünde bulundur:

(dansçı harika)

Burada, alt grup veya alt dizi, dansçı harika.

Ortak Parçalı Alt Diziler

Paydaş, bir işletmede çıkarı olan bir kişidir. Bir web sitesi olan stake.com olan bir işletme hayal edin. Aşağıdaki hedef dizelerden birinin bilgisayarda olduğunu hayal edin:

Web sitesi, stake.com iş içindir.;

Paydaş var.;

Paydaş, stake.com için çalışır;

Bu dizelerden herhangi birinin hedef olmasına izin verin. Programcı, stake.com'un veya paydaşın herhangi bir hedef dizide olup olmadığını bilmek isteyebilir. Onun kalıbı şöyle olurdu:

stake.com|paydaş

dönüşüm kullanarak.

stake iki kelimede iki kez yazılmıştır. Bu, kalıbı aşağıdaki gibi yazarak önlenebilir:

hisse(.com|tutucu)

.com|holder bu durumda alt gruptur.

Not: Bu durumda alternatif karakterin kullanılması. stake.com veya paydaş aranmaya devam edecektir. Aşağıdaki kodun çıktısı bulunur:

P='Web sitesi, stake.com iş içindir.'
Eğer [[ $ str=~ hisse(.ile birlikte|Kulp) ]];sonra
dışarı attıbulundu
olmak

Burada eşleşen alt dize stake.com'dur.

BASH_REMATCH Önceden Tanımlanmış Dizi

BASH_REMATCH önceden tanımlanmış bir dizidir. Bir desenin grupları olduğunu varsayalım. Eşleşen tüm grup, bu dizinin 0 dizini için hücreye gider. Eşleşen ilk alt grup, dizin 1 için hücreye gider; eşleşen ikinci alt grup, dizin 2 için hücreye girer, vb. Aşağıdaki kod, bu dizinin nasıl kullanılacağını gösterir:

P='Sahne dansçısı geldi.'
Eğer [[ $ str=~ sahne(dansçı) ]];sonra
dışarı attıbulundu
olmak

içinbeniçinde ${!BASH_REMATCH[@]};yapmak
baskı '${BASH_REMATCH[i]}'
tamamlamak
dışarı attı

Çıktı:

bulundu
sahne dansçısı, dansçı,

Tüm grup sahne dansçısı. Dansçı olan tek bir alt grup vardır.

Not: desendeki boşluk kaçmıştır.

Büyük/Küçük Harf Bağımsız Uyum

Eşleştirme, yukarıda açıklandığı gibi, büyük/küçük harfe duyarlıdır. Eşleştirme, vakadan bağımsız olarak yapılabilir. Bu, aşağıdaki kodda gösterilmiştir:

dükkanlar -snocasematch

P='İyi müziği seviyoruz.'
Eğer [[ $ str=~ İyi]];sonra
dışarı attıbulundu
olmak

dükkanlar -unocasematch

Çıktı: bulundu. Model, GoodOd. Eşleşen alt dize 'iyi'. Nocasematch seçeneğinin kod bölümünün başında nasıl etkinleştirildiğini ve kod bölümünün sonunda nasıl devre dışı bırakıldığını not edin.

Bir Dizenin Uzunluğu

Bir dizenin uzunluğunu elde etmek için sözdizimi şöyledir:

${#PARAMETRE}

Örnek:

P='İyi müziği seviyoruz.'
dışarı attı $ {# dizi}

Çıktı: 19.

Dize Azaltma

Dize azaltma için sözdizimleri şunlardır:

${PARAMETRE:OFFSET}
${PARAMETRE:OFFSET:UZUNLUK}

OFFSET için sayımın sıfırdan başladığı yer.

Aşağıdaki örnek, bir dizenin ilk 11 karakterinin nasıl kaldırılacağını gösterir:

P='Ben her zaman iyi müzikle dans ederim.'
dışarı attı $ {str: 10}

Çıktı:

iyi müzik dinle.

UZUNLUK için sayma, bir sonraki karakterden başlar. Aşağıdaki kod, dize içindeki bir bölüme nasıl izin verilebileceğini gösterir:

P='Ben her zaman iyi müzikle dans ederim.'
dışarı attı $ {str: 10: 6}

Çıktı:

as t

İlk 11 karakter kaldırıldı; sonraki 6 karaktere izin verildi ve kalan karakterler otomatik olarak kaldırıldı.

Ara ve Değiştir

Bir alt dize bulunduğunda, başka bir alt dize ile değiştirilebilir. Bunun için sözdizimleri şunlardır:

nerede=${PARAMETRE/DESEN/DEĞİŞTİRME}
nerede=${PARAMETRE//DESEN/DEĞİŞTİRME}
nerede=${PARAMETRE/DESEN}
nerede=${PARAMETRE//DESEN}

Tek eğik çizgili ilk sözdizimi için yalnızca ilk eşleşme değiştirilir. Örnek:

P='Odada bir fare, bir yarasa ve bir kedi var.'
sağ=${str/[cbr]at/büyük inek}
dışarı attı $ str
dışarı attı $ ret

Çıktı:

Odada bir sıçan, bir yarasa ve bir kedi var.
Odada büyük bir inek, bir yarasa ve bir kedi var.

Çift eğik çizgili ikinci sözdizimi için eşleşmenin tüm oluşumları değiştirilir. Örnek:

P='Odada bir fare, bir yarasa ve bir kedi var.'
sağ=${str//[cbr]at/büyük inek}
dışarı attı $ str
dışarı attı $ ret

Çıktı:

Odada bir sıçan, bir yarasa ve bir kedi var.
Odada büyük bir inek, büyük bir inek ve büyük bir inek var.

Tek eğik çizgili üçüncü sözdizimi için, ilk ve tek eşleşmenin yerini alacak bir şey yoktur.

Ayrıca, bulunan ilk alt dizi silinir. Örnek:

P='Odada bir fare, bir yarasa ve bir kedi var.'
sağ=${str/[cbr]at}
dışarı attı $ str
dışarı attı $ ret

Çift eğik çizgili dördüncü sözdizimi için, tüm eşleşmeler için bir değiştirme yoktur. Ayrıca, bulunan tüm alt dizeler silinir. Örnek:

P='Odada bir fare, bir yarasa ve bir kedi var.'
sağ=${str//[cbr]at}
dışarı attı $ str
dışarı attı $ ret

Çıktı:

Odada bir sıçan, bir yarasa ve bir kedi var.
Odada a, a ve a var.

Çözüm

Bash'de bir dizginin alt dizgisi olup olmadığını kontrol etmek için, Model Eşleştirme kullanılmalıdır. Model Eşleştirme yalnızca çift köşeli parantez [[ . . . ]]. ${ ile parametre genişletmede de yer alabilir. . .}. Parametre genişletmesi ile dizinlere göre bir alt dizi elde etmek mümkündür.

Bu makalede sunulanlar, Pattern Matching'deki en kritik noktalardır. Fazlası var! Ancak, okuyucunun bundan sonra çalışması gereken şey, Dosya Adı Genişletmedir.