Bash 4.3 Отрицательная длина подстроки на OS X

Bash 4.3 Отрицательная длина подстроки на OS X

В 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}.

Связанный контент