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?
bash
string-manipulation
Brent Faust
sumber
sumber
echo "Hello World" | rev | cut -c -5 | rev
Jawaban:
Sementara solusi flabdablet hanya berfungsi untuk string dengan panjang tetap, Anda dapat menggunakan ini sebagai pengganti drop-in untuk string berukuran dinamis:
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.
sumber
$ {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.
sumber
Dicari dari sini :
Mereka mengatakan
${STR:6:$#-1}
harus bekerja dengan baikDalam kasus saya, dengan kesalahan yang sama
${VERSION::-2}
, itu hanya mulai bekerja setelah menambahkan 0 seperti ini:${VERSION:0:-2}
.sumber