bash: Bir adımda birden çok dize manipülasyonu (parametre genişletme) nasıl kullanılır?

Aug 15 2020

Ben string=substr1-substr2-substr3.substr4altdizgelerin değişken uzunluktaki nerede. Ben ayıklamak istiyorum substr3den stringve kullanma yapıyor düşünüyorum ${string##pattern}ve ${string%pattern}dize manipülasyon genişlemeleri. Bu yaklaşımı kullanarak , sonuçta ortaya çıkan genişlemeyi çalıştırmam ${string##*-}ve çalıştırmam gerektiği açıktır ${string%.*}veya bunun tersi de geçerlidir. Sorularım:

  1. bu en iyi seçim mi?
  2. Varsa, ikisini de tek adımda nasıl çalıştırırım? ${string##*-${string%.*}}Ya da gibi bir şey yapmaya çalıştığımda ${string%.*${string##*-}}dizenin tamamını geri alırım. İlk adımın sonucuna bir ara değişken atayarak ve sonra onu değiştirerek her zaman iki adımda ayıklama yapabileceğimi fark ettim; ama bunu tek adımda yapmak istiyorum. Nasıl devam edeceğim?

TIA!

Yanıtlar

2 ilkkachu Aug 15 2020 at 20:39

Verilen

string=substr1-substr2-substr3.substr4

${string%.*} dır-dir

substr1-substr2-substr3

böylece, ${string##*-${string%.*}}olduğu

${string##*-substr1-substr2-substr3}

bu da başından itibaren stringher şeyi kaldırmak anlamına gelir -substr1-substr2-substr3. Ancak stringönünde tire olmadığı için içinde böyle bir alt dize yoktur substr1, böylece orijinal dizeyi elde edersiniz.

Muhtemelen istediğin şey

string=substr1-substr2-substr3.substr4
result="${string%.*}" result="${result##*-}"

bu da resultkontaminasyona yol açar substr3.

Zsh'ta bunu tek adımda yapabilirsiniz: ancak bu Bash'de çalışmaz.result=${${string%.*}##*-}

Bash, sen sağ tarafında açılımların dair bir sınırlama #ya %ve başlangıç ve dizenin sonuna ikisi parçaları kaldırmak gerekir çünkü o burada yardımcı olmaz.


Alternatif olarak, $stringyeni satır karakterleri içermiyorsa, kullanabilirsiniz

IFS=.- read -r a b c d <<< "$string"

ve okumak substr3kapalı c.

Bu durumda, dizinin kabuğuna ve boyutuna bağlı olarak, içeriği $stringya geçici bir dosyada saklanacak ya readda ilk satırı okuyup ona göre ayıracak bir boru içinden beslenecektir $IFS.