Bash 4.3 OS X'de Alt Tabaka Negatif Uzunluğu


12

Bash 4.2 negatif alt dize uzunlukları için destek ekledi:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

Örnek 37-12. Dize çıkarma yapısında negatif parametre

"Uzunluk" parametresi negatif olduğunda, uçtan uca bir parametre görevi görür.

Örneğin, Ubuntu üzerinde test edildiğinde aşağıdaki "Dünya" çıktıları:

STR="Hello World!"
echo ${STR:6:-1}

Ancak OS X'te (GNU bash, sürüm 4.3.42 (1) -çalışma (x86_64-apple-darwin14.5.0)), bu kullanım aşağıdaki hatayı üretir:

-1: substring expression < 0

Bu OS X'e özgü mü, yoksa daha sonraki bash güncellemelerinde tekrar devre dışı mı bırakıldı? OS X için bu işlevselliği etkinleştirmenin bir yolu var mı?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - v2, v3 ve v4 ile başladıktan sonra eklenenler.
Hannu

@Hannu evet, bu belge negatif uzunluk semantiğinin 4.2 sürümünde eklendiğini söylüyor
Brent Faust

Aynı sorunum var: Bununla başa çıkmanın bir yolunu buldunuz mu?
Romain Jouin

@romainjouin Sadece algoritmayı değiştirerek. Bu sözdizimi, Bash sürüm 4.3.46'dan itibaren bile OX X altında çalışmaz! Buna daha fazla göz atmaya çalışmak için soruyu yukarı oylayın. Birisi cevabı biliyor ...
Brent Faust

1
@Rististro Şuna basın: | Bunun bir yolu (örneğin)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Yanıtlar:


7

Flabdablet'in çözümü yalnızca sabit uzunluklu dizeler için çalışırken, bunu dinamik boyutlu dizeler için bir bırakma yedeği olarak kullanabilirsiniz:

echo ${STR:6:$((${#STR} - 6 - 1))}

Detayda:

  • ${#STR} dizenin uzunluğunu döndürür.
  • $((a - b - c)) matematiksel çıkarma yapar
  • ${STR:start:len} bir alt dize döndürür.

Dolayısıyla, alt dize ifadesinin ikinci argümanıyla birleştirildiğinde, dizenin uzunluğu eksi başlangıç ​​ofseti eksi yeni bash sözdiziminde negatif değer olarak belirteceğiniz değer eklenir.


2

STR'in en az 7 karakter içerdiği garanti ediliyorsa, $ {STR: 6: $ {# STR} -7}, $ {STR: 6: -1} için çalışan bir drop-in yedeği olmalıdır. Daha kısa olabilirse, bu, OS X bash'ın negatif uzunluklardan şikayet etmesine veya negatif uzunlukların sağdan ofset olarak alınmasını destekleyen bash sürümlerinde korkunç bir şekilde yanlış gitmesine neden olur.


Teşekkürler, benim için hile
Jean-Bernard Jansen

0

Buradan googled :

İyi ${STR:6:$#-1}çalışması gerektiğini söylüyorlar

Benim durumumda, benzer bir hata ile ${VERSION::-2}, sadece böyle 0 ekledikten sonra işe başlamış: ${VERSION:0:-2}.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.