bash: Bir adımda birden çok dize manipülasyonu (parametre genişletme) nasıl kullanılır?
Ben string=substr1-substr2-substr3.substr4
altdizgelerin değişken uzunluktaki nerede. Ben ayıklamak istiyorum substr3
den string
ve 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:
- bu en iyi seçim mi?
- 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
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 string
her ş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 result
kontaminasyona 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, $string
yeni satır karakterleri içermiyorsa, kullanabilirsiniz
IFS=.- read -r a b c d <<< "$string"
ve okumak substr3
kapalı c
.
Bu durumda, dizinin kabuğuna ve boyutuna bağlı olarak, içeriği $string
ya geçici bir dosyada saklanacak ya read
da ilk satırı okuyup ona göre ayıracak bir boru içinden beslenecektir $IFS
.