Bash'te Dize Manipülasyonunu Kırmak
Kabuk komut dosyalarıyla çalışırken, yaygın bir görev, bir dizeyi sınırlayıcıya göre bölmektir. Örneğin, noktalı virgülle ayrılmış e-posta adreslerini içeren bir dize düşünün. Her e-postayı ayrı ayrı işlemeniz gerekiyorsa, bu dizenin nasıl bölüneceğini anlamak çok önemli hale gelir. Bu makale, Bash'te bunu başarmak için farklı yöntemler konusunda size rehberlik edecektir.
'tr' komutunu kullanmak ve Dahili Alan Ayırıcıyı (IFS) değiştirmek gibi çözümleri araştıracağız. Sonunda, dize bölme işlemini verimli bir şekilde gerçekleştirebilecek ve IFS'yi varsayılan değerine sıfırlayabileceksiniz. Gelin, Bash komut dosyası oluşturma görevlerinizi derinlemesine inceleyelim ve basitleştirelim!
Emretmek | Tanım |
---|---|
tr | Karakterleri çevirir veya siler. Burada, dizeyi bölmek amacıyla noktalı virgülü yeni satır karakteriyle değiştirmek için kullanılır. |
IFS | Bash komut dosyalarındaki belirli bir sınırlayıcıya göre dizeleri bölmek için kullanılan Dahili Alan Ayırıcı. |
read -r -a | Bir giriş satırını okur ve onu bir diziye böler. -r seçeneği ters eğik çizgilerin kaçış karakterleri olarak yorumlanmasını önler. |
echo | Metni standart çıktıya yazdırır. Bölünmüş dize öğelerini görüntülemek için kullanılır. |
split | Bir dizeyi, belirtilen sınırlayıcıya dayalı olarak dizeler listesine bölen bir Perl işlevi. |
foreach | Bir değerler listesi üzerinde yinelenen bir Perl döngü yapısı. |
Bash String Bölme Tekniklerini Anlamak
İlk Bash betiği, bir dizenin aşağıdakileri kullanarak nasıl bölüneceğini gösterir: tr emretmek. Burada bir string tanımlıyoruz IN="bla@some.com;john@home.com" ve kullan echo ile birlikte tr noktalı virgül sınırlayıcısını yeni satır karakterine çevirmek için. Bu, dizeyi etkili bir şekilde ayrı satırlara böler. for döngü daha sonra her satırda yinelenir ve adresleri köşeli parantez içine yazdırır. Bu yöntem basittir ve dizeleri işlemek için Unix komutlarının güçlü metin işleme yeteneklerinden yararlanır.
Başka bir yöntem, ayarlamayı içerir. Internal Field Separator (IFS). Geçici olarak ayarlayarak IFS noktalı virgül kullanarak dizeyi bir diziye bölebiliriz. Orijinali saklıyoruz IFS ile OIFS değiştirmeden önce, daha sonra geri yükleyebilmemizi sağlamak. read -r -a komut, giriş dizesini adı verilen bir diziye okur mails2, değiştirilene göre bölme IFS. İşlemden sonra orijinal IFS restore edildi. Bu yaklaşım, Bash'te dize bölme işleminin daha programlı bir yolunu sağlayarak, dizileri daha fazla düzenleme için kullanmamıza olanak tanır.
Sınırlayıcıda Dizeleri Bölmek için Bash Kullanma
Bash Komut Dosyası
#!/usr/bin/env bash
# Input string
IN="bla@some.com;john@home.com"
# Split string using 'tr' and iterate
mails=$(echo $IN | tr ";" "\n")
for addr in $mails; do
echo "> [$addr]"
done
# Output:
# > [bla@some.com]
# > [john@home.com]
IFS Kullanarak Bash'te Bir Dizeyi Bölme
Bash Komut Dosyası
#!/usr/bin/env bash
# Input string
IN="bla@some.com;john@home.com"
# Save the original IFS
OIFS=$IFS
# Set IFS to semicolon
IFS=';'
# Split string into an array
read -r -a mails2 <<< "$IN"
# Restore the original IFS
IFS=$OIFS
# Iterate over the array
for x in "${mails2[@]}"; do
echo "> [$x]"
done
# Output:
# > [bla@some.com]
# > [john@home.com]
Dize Bölme için Python Kullanımı
Python Komut Dosyası
#!/usr/bin/env python3
# Input string
IN = "bla@some.com;john@home.com"
# Split string by semicolon
mails = IN.split(';')
# Iterate and print each element
for addr in mails:
print(f"> [{addr}]")
# Output:
# > [bla@some.com]
# > [john@home.com]
Bir Dizeyi Bölmek için Perl Kullanmak
Perl Komut Dosyası
#!/usr/bin/env perl
use strict;
use warnings;
# Input string
my $IN = "bla@some.com;john@home.com";
# Split string by semicolon
my @mails = split(';', $IN);
# Iterate and print each element
foreach my $addr (@mails) {
print "> [$addr]\n";
}
# Output:
# > [bla@some.com]
# > [john@home.com]
Bash'te Gelişmiş String Bölme Teknikleri
Bash'te dizeleri bölmenin bir başka güçlü yöntemi, awk emretmek. awk desen tarama ve işleme için tasarlanmış çok yönlü bir komut satırı yardımcı programıdır. Özel alan ayırıcıları tanımlamamıza olanak tanıdığından, dizeleri bölmek için özellikle yararlı olabilir. Örneğin şunu kullanabiliriz: awk -F";" '{print $1, $2}' noktalı virgül sınırlayıcıya göre bir dizeyi bölmek ve tek tek bileşenleri yazdırmak için. Bu yöntem son derece esnektir ve daha karmaşık dize işleme görevlerini yerine getirebilir, bu da onu Bash programcısının araç setinde değerli bir araç haline getirir.
Ek olarak, cut Dizeleri sınırlayıcılara göre bölmek için komut kullanılabilir. cut komutu genellikle giriş verilerinin her satırından bölümler çıkarmak için kullanılır. ile bir sınırlayıcı belirterek -d seçeneğini seçin ve alanları seçin. -f seçeneğini kullanarak bir dizenin parçalarını verimli bir şekilde bölebilir ve çıkartabiliriz. Örneğin, kullanarak echo $IN | cut -d';' -f1 ilk e-posta adresini giriş dizesinden çıkarır. Bu gelişmiş yöntemler, Bash'teki dize işleme görevleri için daha fazla kontrol ve hassasiyet sağlar.
Bash'te Dize Bölme Hakkında Yaygın Sorular ve Cevaplar
- Bash'te sınırlayıcıdaki bir dizeyi nasıl bölerim?
- Şunu kullanabilirsiniz: IFS değişken veya komutlar gibi tr, awk, Ve cut sınırlayıcıdaki dizeleri bölmek için.
- Nedir IFS Bash'te değişken?
- IFS (Dahili Alan Ayırıcı), giriş metnini kelimelere veya belirteçlere bölmek için kullanılan karakterleri tanımlayan özel bir değişkendir.
- nasıl sıfırlayabilirim IFS değişken varsayılan değerine döndürülür mü?
- Orijinali kaydet IFS değerini değiştirmeden önce değiştirin ve işlendikten sonra geri yükleyin: OIFS=$IFS; IFS=';'; ... ; IFS=$OIFS.
- Ne yapar tr komut dize bölmede yapılır mı?
- tr komut karakterleri çevirir veya siler. Bir dizeyi bölmek için sınırlayıcıları yeni satırlarla değiştirebilir: echo $IN | tr ";" "\n".
- Bash'i kullanarak bir dizeyi diziye bölebilir miyim?
- Evet, değiştirerek IFS değişken ve kullanım read -r -a, bir dizeyi bir diziye bölebilirsiniz: read -r -a array <<< "$string".
- Nedir awk komut ne için kullanılır?
- awk desen tarama ve işlemeye yönelik bir komut satırı yardımcı programıdır. Özel alan ayırıcıları tanımlayarak dizeleri bölebilir.
- Nasıl olur cut komuta işi?
- cut komut her giriş satırından bölümler çıkarır. Bir sınırlayıcı belirleyip alanları seçerek dizeleri bölebilir: echo $string | cut -d';' -f1.
- Neden kullanılıyor IFS dize bölmede yararlı mı?
- Kullanma IFS dizeleri bölmek için özel sınırlayıcılar tanımlamanıza olanak tanır, bu da onu farklı giriş formatları için çok yönlü hale getirir.
- Bash'te bir dizeyi birden fazla sınırlayıcıya bölmek mümkün mü?
- Evet, aşağıdakilerin bir kombinasyonunu kullanabilirsiniz: tr Ve awk birden fazla sınırlayıcıyı işlemek için.
- Kullanabilirmiyim sed Bash'te dize bölmek için?
- Sırasında sed öncelikle bir akış düzenleyicisidir, aşağıdaki gibi diğer komutlarla birleştirilebilir awk dizeleri dolaylı olarak bölmek için.
Bash'te Dize Bölme Üzerine Son Düşünceler
Bash'te dize manipülasyonunda ustalaşmak, komut dosyası yazma verimliliğinizi önemli ölçüde artırabilir. Kullanılıp kullanılmayacağı IFS basit sınırlayıcılar veya daha gelişmiş araçlar için tr Ve awk, bu teknikler etkili Bash programlama için gereklidir. Her zaman orijinali geri yüklemeyi unutmayın IFS komut dosyalarınızda beklenmeyen davranışları önlemek için. Bu yöntemlerle Bash betiklerinizde çok çeşitli dize işleme görevlerini gerçekleştirebilirsiniz.