Bir Bash Dizesinin Linux'ta Bir Alt Dize İçerip İçermediği Nasıl Anlaşılır

Yayınlanan: 2022-09-21
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

Bazen 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.

Linux'ta Bash'de Dizeler Nasıl Manipüle Edilir
İLGİLİ Linux'ta Bash'de Dizeler Nasıl Manipüle Edilir

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 
Linux'ta Çift Parantez Koşullu Testler Nasıl Kullanılır
İLGİLİ Linux'ta Çift Parantez Koşullu Testler Nasıl Kullanılır

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 

chmod ile çalıştırılabilir bir komut dosyası yapma

Senaryoyu çalıştıralım.

 ./double.sh 

Double.sh betiğini çalıştırma

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 

Double2.sh betiğini çalıştırma

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 

double3.sh betiğini çalıştırma

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 

case.sh betiğini çalıştırma

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.

Linux'ta grep Komutu Nasıl Kullanılır
İLGİLİ Linux'ta grep Komutu Nasıl Kullanılır

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 

subgrep.sh betiğini çalıştırma

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.

Linux'ta sed Komutu Nasıl Kullanılır
İLGİLİ Linux'ta sed Komutu Nasıl Kullanılır

İ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 

subsed.sh betiğini çalıştırma

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

subsed.sh betiğini eşsiz bir alt dizeyle çalıştırma

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