Bash 4.3 Substring Panjang Negatif pada OS X

12

Bash 4.2 menambahkan dukungan untuk panjang substring negatif:

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

Contoh 37-12. Parameter negatif dalam konstruksi ekstraksi string

Ketika parameter "length" negatif, ia berfungsi sebagai parameter offset-dari-ujung.

Misalnya, keluaran berikut "Dunia" saat diuji di Ubuntu:

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

Tetapi dalam OS X (GNU bash, versi 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)), penggunaan itu menghasilkan kesalahan berikut:

-1: substring expression < 0

Apakah OS X ini spesifik, atau apakah dinonaktifkan lagi di pembaruan pesta nanti? Apakah ada cara untuk mengaktifkan fungsi ini untuk OS X?

Brent Faust
sumber
1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - apa yang ditambahkan saat, dimulai dengan v2, v3 dan v4 mengikuti.
Hannu
@ Hanu ya, dokumen itu mengatakan bahwa semantik panjang negatif ditambahkan di versi 4.2
Brent Faust
Saya memiliki masalah yang sama: apakah Anda menemukan cara untuk menghadapinya?
Romain Jouin
@romainjouin Hanya dengan mengubah algoritma. Sintaks ini tidak berfungsi di bawah OX X, bahkan pada Bash versi 4.3.46! Pilih suara pertanyaan untuk mencoba mendapatkan lebih banyak perhatian pada ini. Seseorang tahu jawabannya ...
Brent Faust
1
@Rubistro Tekan saja ini: | Salah satu caranya adalah (dalam contoh Anda)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Jawaban:

7

Sementara solusi flabdablet hanya berfungsi untuk string dengan panjang tetap, Anda dapat menggunakan ini sebagai pengganti drop-in untuk string berukuran dinamis:

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

Secara terperinci:

  • ${#STR} mengembalikan panjang string.
  • $((a - b - c)) melakukan pengurangan matematika
  • ${STR:start:len} mengembalikan substring.

Jadi gabungan argumen kedua dengan ekspresi substring adalah panjang string dikurangi offset awal dikurangi nilai yang Anda tentukan sebagai nilai negatif dalam sintaks bash yang lebih baru.

kayahr
sumber
2

$ {STR: 6: $ {# STR} -7} harus menjadi pengganti drop-in yang berfungsi untuk $ {STR: 6: -1} jika STR dijamin mengandung setidaknya 7 karakter. Jika bisa lebih pendek, ini juga akan menyebabkan OS X bash mengeluh tentang panjang negatif, atau salah besar pada versi bash yang mendukung panjang negatif diambil sebagai dari offset kanan.

flabdablet
sumber
Thx, lakukan trik untuk saya
Jean-Bernard Jansen
0

Dicari dari sini :

Mereka mengatakan ${STR:6:$#-1}harus bekerja dengan baik

Dalam kasus saya, dengan kesalahan yang sama ${VERSION::-2}, itu hanya mulai bekerja setelah menambahkan 0 seperti ini: ${VERSION:0:-2}.

Aleksei Tselishchev
sumber