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