В Bash 4.2 добавлена поддержка отрицательных длин подстрок:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
Пример 37-12. Отрицательный параметр в конструкции извлечения строки
Когда параметр "length" отрицателен, он служит параметром смещения от конца.
Например, следующие результаты «Мир» при тестировании на Ubuntu:
STR="Hello World!"
echo ${STR:6:-1}
Но в OS X (GNU bash, версия 4.3.42 (1) -релиз (x86_64-apple-darwin14.5.0)) такое использование приводит к следующей ошибке:
-1: substring expression < 0
Этот OS X специфичен, или он был снова отключен в последующих обновлениях bash? Есть ли способ включить эту функцию для OS X?
bash
string-manipulation
Брент Фауст
источник
источник
echo "Hello World" | rev | cut -c -5 | rev
Ответы:
Хотя решение flabdablet работает только для строк фиксированной длины, вы можете использовать его в качестве замены для динамически изменяемых строк:
В деталях:
${#STR}
возвращает длину строки.$((a - b - c))
делает математическое вычитание${STR:start:len}
возвращает подстроку.Таким образом, второй аргумент выражения подстроки объединяет длину строки минус начальное смещение минус значение, которое вы указали бы как отрицательное значение в новом синтаксисе bash.
источник
$ {STR: 6: $ {# STR} -7} должен быть рабочей заменой $ {STR: 6: -1}, если в STR гарантированно содержится не менее 7 символов. Если это может быть короче, это также заставит OS X bash жаловаться на отрицательные длины или будет идти ужасно неправильно в версиях bash, которые поддерживают отрицательные длины, принимаемые как смещения справа.
источник
Погуглил отсюда :
Говорят,
${STR:6:$#-1}
должно хорошо работатьВ моем случае, с такой же ошибкой
${VERSION::-2}
, он просто начал работать после добавления 0 , как это:${VERSION:0:-2}
.источник