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] ]];sonradış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] ]];sonradış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] ]];sonradış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 ]];sonradış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] ]];sonradış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] ]];sonradış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]];sonradış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 -snocasematchP='İ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.