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


12

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


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - что было добавлено, когда, начиная с v2, v3 и v4, следует.
Ханну

@ Ханну, да, в этом документе говорится, что семантика отрицательной длины была добавлена ​​в версии 4.2
Брент Фауст

У меня та же проблема: вы нашли способ с этим справиться?
Ромен

@romainjouin Просто изменив алгоритм. Этот синтаксис просто не работает под OX X, даже с версии Bash 4.3.46! Проголосуйте за вопрос, чтобы попытаться получить больше глаз на это. Кто-то знает ответ ...
Брент Фауст

1
@Rubistro Просто ударил это: | Один из способов обойти это (в вашем примере)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Ответы:


7

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


Thx, сделал трюк для меня
Жан-Бернар Янсен

0

Погуглил отсюда :

Говорят, ${STR:6:$#-1}должно хорошо работать

В моем случае, с такой же ошибкой ${VERSION::-2}, он просто начал работать после добавления 0 , как это: ${VERSION:0:-2}.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.