11

В 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?

2 ответа2

4

В то время как решение 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, которые поддерживают отрицательные длины, принимаемые как смещения справа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .