bash: Bir adımda birden çok dize manipülasyonu (parametre genişletme) nasıl kullanılır?
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:
- 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 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.