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

1531
Brent Faust

В Bash 4.2 добавлена ​​поддержка отрицательных длин подстрок:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

Пример 37-12. Отрицательный параметр в конструкции извлечения строки

Когда параметр "length" отрицателен, он служит параметром смещения от конца.

Например, следующие результаты «Мир» при тестировании на Ubuntu:

STR="Hello World!" echo $ 

Но в OS X (GNU bash, версия 4.3.42 (1) -релиз (x86_64-apple-darwin14.5.0)) такое использование приводит к следующей ошибке:

-1: substring expression < 0 

Это специфическая OS X, или она была снова отключена в последующих обновлениях bash? Есть ли способ включить эту функцию для OS X?

9
http://tldp.org/LDP/abs/html/abs-guide.html#BASH2 - что было добавлено, когда, начиная с v2, v3 и v4, следует. Hannu 8 лет назад 1
@ Ханну, да, этот документ говорит, что семантика отрицательной длины была добавлена ​​в версии 4.2 Brent Faust 8 лет назад 0
У меня та же проблема: вы нашли способ с этим справиться? Romain Jouin 7 лет назад 0
@romainjouin Просто изменив алгоритм. Этот синтаксис просто не работает в OX X, даже в версии Bash 4.3.46! Проголосуйте за вопрос, чтобы попытаться получить больше глаз на это. Кто-нибудь знает ответ ... Brent Faust 7 лет назад 0
@Rubistro Просто ударил это: | Одним из способов обойти это (в вашем примере) `echo" Hello World "| рев | вырезать -c -5 | rev` donovanmuller 7 лет назад 1

2 ответа на вопрос

2
flabdablet

$ -7} должен быть рабочей заменой $, если в STR гарантированно содержится не менее 7 символов. Если это может быть короче, это также заставит OS X bash жаловаться на отрицательные длины или будет ужасно ошибаться в версиях bash, которые поддерживают отрицательные длины, принимаемые как смещения справа.

Thx, сделал трюк для меня Jean-Bernard Jansen 5 лет назад 0
2
kayahr

В то время как решение flabdablet работает только для строк фиксированной длины, вы можете использовать его в качестве замены для строк динамического размера:

echo $ - 6 - 1))} 

В деталях:

  • ${#STR} возвращает длину строки.
  • $((a - b - c)) делает математическое вычитание
  • $ возвращает подстроку

Таким образом, второй аргумент выражения подстроки объединяет длину строки минус начальное смещение минус значение, которое вы указали бы как отрицательное значение в новом синтаксисе bash.