Bir Bash Dizesinin Linux'ta Bir Alt Dize İçerip İçermediği Nasıl Anlaşılır
Yayınlanan: 2022-09-21Bazen Linux komut dosyalarında, bir metin dizisinin belirli, daha küçük bir dize içerip içermediğini bilmek istersiniz. Bunu yapmanın birçok yolu var. Size bazı basit, güvenilir teknikler gösteriyoruz.
Bu Neden Yararlı?
Daha küçük bir alt dize için bir dize aramak yaygın bir gereksinimdir. Bir örnek, bir dosyadan veya insan girdisinden metin okumak ve komut dosyanızın daha sonra ne yapacağına karar verebilmesi için dizeyi belirli bir alt dize için aramak olabilir. Bir yapılandırma dosyasında bir etiket veya aygıt adı veya bir kullanıcıdan gelen bir girdi satırında bir komut dizesi arıyor olabilir.
Linux kullanıcıları, metni işlemek için herhangi bir sayıda yardımcı programla kutsanmıştır. Bazıları Bash kabuğunda yerleşiktir, diğerleri bağımsız yardımcı programlar veya uygulamalar olarak sağlanır. Unix'ten türetilen işletim sistemlerinin, dizi işleme yetenekleriyle zengin bir şekilde sunulmasının bir nedeni var.
Dosya gibi görünen bazı şeyler basit dosyalar değildir. Donanım aygıtları ve sistem bilgisi kaynakları gibi şeyleri temsil eden özel dosyalardır . İşletim sistemi tarafından gerçekleştirilen soyutlama, onlara dosyaların görünümünü ve özelliklerini verir. Onlardan gelen bilgileri - doğal olarak metin olarak - okuyabilir ve bazı durumlarda onlara yazabilirsiniz, ancak bunlar sıradan dosyalar değildir.
Metin, bir terminal penceresindeki komutlar için giriş ve çıkış olarak da kullanılır. Bu, giriş ve çıkışın yeniden yönlendirilmesine ve borulanmasına izin verir. Bu işlevsellik, bir komuttan çıktıyı girdi olarak diğerine geçirerek Linux komut dizilerini birbirine zincirleme yeteneğinin temelini oluşturur.
Kökeni ne olursa olsun, aldığımız metni önemli bir kelime, komut, etiket veya başka bir gösterge için aramak, metin tabanlı verilerle uğraşmanın standart bir parçasıdır. İşte kendi komut dosyalarınıza dahil edebileceğiniz basit tekniklerden oluşan bir koleksiyon.
Bash Yerleşimleriyle Alt Dizileri Bulma
Çift parantez “ [[...]]
” dize karşılaştırma testi, bir dizenin başka bir dize içerip içermediğini belirlemek için if
ifadelerinde kullanılabilir.
Bu komut dosyasını bir düzenleyiciye kopyalayın ve "double.sh" adlı bir dosyaya kaydedin.
#!/bin/bash if [[ "maymun" = *"anahtar"* ]]; sonra echo "anahtar maymunda" başka echo "anahtar maymunda değil" fi
Komut dosyasını chmod
komutuyla yürütülebilir hale getirmeniz gerekir. Bu, herhangi bir komut dosyasını yürütülebilir hale getirmek için her zaman gerekli olan bir adımdır. Her komut dosyası oluşturduğunuzda bunu yapmanız gerekecektir. Her durumda uygun komut dosyasının adını değiştirin.
chmod +x çift.sh
Senaryoyu çalıştıralım.
./double.sh
Bu, yıldız işareti ” *
” hiçbir karakter dahil olmak üzere herhangi bir karakter dizisini temsil ettiğinden işe yarar. "Anahtar" alt dizisi, önünde veya arkasında herhangi bir karakter olsun veya olmasın, hedef dizi içinde bulunuyorsa, test true değerini döndürür.
Örneğimizde, alt dizenin önünde karakterler var. Bunlar ilk yıldızla eşleştirilir. Alt dizenin arkasında harf yoktur, ancak yıldız işareti de hiçbir karakterle eşleşmediğinden test yine de geçer.
Esneklik için, komut dosyamızı değişmez dizeler yerine değişkenleri işleyecek şekilde değiştirebiliriz. Bu, "double2.sh" komut dosyasıdır.
#!/bin/bash string="Maymun" alt dize = "anahtar" if [[ $dizi = *$altdizi* ]]; sonra echo "$substring, $string'de bulundu" başka echo "$substring, $dize içinde bulunamadı" fi
Nasıl çalıştığını görelim.
./double2.sh
Bu aynı şekilde çalışır ve değişmez dizeler yerine değişken adlarını kullanabilme avantajıyla birlikte çalışır. Küçük çözümümüzü bir işleve dönüştürmek en fazla esnekliği sağlayacaktır.
Bu, "double3.sh" komut dosyasıdır.
#!/bin/bash shopt -s nocasematch string="Maymun" substring="Anahtar" sermaye = "Londra" check_substring () { eğer [[ $1 = *$2* ]]; sonra echo "$2, $1 içinde bulundu" başka echo "$2, $1 içinde bulunamadı" fi } check_substring "Maymun" "anahtar" check_substring $dize $altdizi check_substring $string "muz" check_substring "Galler" $ sermaye
Değişkenler ve değişmez dizelerin bir karışımını kullanarak check_substring
işlevimizi çağırırız. Eşleşmeleri büyük/küçük harfe duyarlı hale getirmek için nocasematch
ayarlamak için -s
(set) seçeneğiyle shopt
kullandık.
İşte nasıl çalıştığı.
./double3.sh
Alt dizeyi yıldızlarla sarma hilesini case
ifadelerinde de kullanabiliriz. Bu "case.sh."
#!/bin/bash shopt -s nocasematch string="Duvar" substring="Duvar" durumda $string *$alt dize*) echo "$substring, $string'de bulundu" ;; *) echo "Hiçbir şey eşleşmedi: $string" ;; esac
Çok uzun if
ifadeleri yerine case
ifadeleri kullanmak, komut dosyalarının okunmasını ve hatalarının ayıklanmasını kolaylaştırabilir. Bir dizgenin olası birçok alt dizgeden birini içerip içermediğini kontrol etmeniz gerekiyorsa, case
ifadesi en iyi seçim olacaktır.
./case.sh
Alt dize bulunur.
grep ile Alt Dizeleri Bulma
Bash yerleşiklerinin ötesinde, muhtemelen ulaşacağınız ilk metin arama aracı grep
. Alt dizelerimizi aramak için bir dize içinde bir dize aramak için grep
doğuştan gelen yeteneğini kullanabiliriz.
Bu komut dosyası "subgrep.sh" olarak adlandırılır.
#!/bin/bash string="lapa kabı" alt dize = "sırt" if $(echo $string | grep -q $altdizi); sonra echo "$substring, $string'de bulundu" başka echo "$substring, $dize içinde bulunamadı" fi
Komut dosyası, dizeyi alt dizeyi arayan grep
göndermek için echo
kullanır. grep
standart çıktıya herhangi bir şey yazmayı durdurmak için -q
(sessiz) seçeneğini kullanıyoruz.
Parantez içindeki komutların sonucu “ (...)
” sıfır ise eşleşme bulundu demektir. Bash'de sıfır, true
değerine eşit olduğundan, if
ifadesi yerine getirilir ve then
yan tümcesi yürütülür.
Bakalım çıktısı ne olacak.
./subgrep.sh
sed ile Alt Dizileri Bulma
Bir alt dize bulmak için de sed
kullanabiliriz.
Varsayılan olarak, sed
içine beslenen tüm metni yazdırır. sed -n
kullanmak bunu engeller. Yazdırılan satırlar yalnızca eşleşen satırlardır. Bu ifade, $substring ile eşleşen veya bu değeri içeren tüm satırları yazdıracaktır.
"/$altdizi/p"
$string
değerini sed
burada bir yönlendirme <<<
kullanarak besleriz. Bu, değerleri geçerli kabukta bir komuta yönlendirmek için kullanılır. Bir borunun yapacağı şekilde bir alt kabuk çağırmaz.
İlk -n
testtir. sed
komutunun çıktısı sıfır değilse true
değerini döndürür. sed
çıktısının sıfır olmamasının tek yolu, eşleşen bir satırın bulunmasıdır. Bu durumda, $substring
$string
içinde bulunmuş olmalıdır.
Bu "subsed.sh."
#!/bin/bash string="İsveç" substring="eden" if [ -n "$(sed -n "/$substring/p" <<< $dize)" ]; sonra echo "$substring, $dize içinde bulundu" başka echo "$substring, $dize içinde bulunamadı" fi
Komut dosyasını çalıştırdığımızda beklenen yanıtı alıyoruz.
./subsed.sh
Karşılaştırmanın başarısız olması için $substring
değerini düzenleyerek betiğin mantığını test edebiliriz.
./subsed.sh
Aramayı Bırak, Buldum
Diğer araçlar, awk
ve Perl
gibi alt dizeleri bulabilir, ancak bir alt dize bulmak gibi basit bir kullanım durumu, bunların ekstra işlevselliğini veya ek karmaşıklığını garanti etmez. Özellikle, alt dizeleri aramak için Bash yerleşiklerini kullanmak hızlı, basittir ve harici araçlar gerektirmez.
İLGİLİ: Bash Komut Dosyalarında Vaka İfadeleri Nasıl Kullanılır