Bash 4.3 Негативна довжина підстрочки в OS X


12

Bash 4.2 додав підтримку негативних довжин підрядків:

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

Приклад 37-12. Негативний параметр у структурі вилучення рядків

Коли параметр "length" від'ємний, він служить параметром зміщення від кінця.

Наприклад, такі виходи "World" при тестуванні на Ubuntu:

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

Цей ОС X специфічний чи його знову відключили в наступних оновленнях bash? Чи є спосіб включити цю функціональність для OS X?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - що додано, коли, починаючи з v2, v3 та v4, слід.
Ханну

@Hannu так, у цьому документі сказано, що семантика від'ємної довжини була додана у версії 4.2
Brent Faust

У мене те саме питання: ви знайшли спосіб вирішити це?
Ромен Жуен

@romainjouin Просто змінивши алгоритм. Цей синтаксис просто не працює в OX X, навіть як у версії 4.3.46 Bash! Вгору проголосуйте питання, щоб спробувати отримати більше погляд на це. Хтось знає відповідь ...
Брент Фауст

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, які підтримують негативні довжини, які приймаються з правого зміщення.


Thx, зробив для мене трюк
Жан-Бернар Янсен

0

Гуглі від сюди :

Кажуть, ${STR:6:$#-1}треба добре працювати

У моєму випадку, з такою ж помилкою ${VERSION::-2}, він просто почав працювати після додавання 0 , як це: ${VERSION:0:-2}.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.