Bash 4.3 Podciąg o długości ujemnej w systemie OS X

12

Bash 4.2 dodał obsługę ujemnych długości podciągów:

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

Przykład 37-12. Parametr ujemny w konstrukcie ekstrakcyjnym

Gdy parametr „długość” jest ujemny, służy jako parametr przesunięcia względem końca.

Na przykład następujące wyniki „Świat” podczas testowania na Ubuntu:

STR="Hello World!"
echo ${STR:6:-1}

Ale w OS X (GNU bash, wersja 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)) użycie to powoduje następujący błąd:

-1: substring expression < 0

Czy ten OS X jest specyficzny, czy też został wyłączony w późniejszych aktualizacjach bash? Czy istnieje sposób włączenia tej funkcji w systemie OS X?

Brent Faust
źródło
1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - co zostało dodane, kiedy następuje, począwszy od wersji 2, wersji 3 i wersji 4.
Hannu,
@ Hanu tak, ten dokument mówi, że semantyka ujemnej długości została dodana w wersji 4.2
Brent Faust
Mam ten sam problem: czy znalazłeś sposób, aby sobie z tym poradzić?
Romain Jouin
@romainjouin Wystarczy zmienić algorytm. Ta składnia po prostu nie działa pod OX X, nawet od wersji Bash 4.3.46! Podnieś głosowanie na pytanie, aby uzyskać więcej oczu na ten temat. Ktoś zna odpowiedź ...
Brent Faust
1
@Rubistro Po prostu kliknij: | Jednym z rozwiązań jest (w twoim przykładzie)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Odpowiedzi:

7

Chociaż rozwiązanie flabdablet działa tylko w przypadku ciągów o stałej długości, można tego użyć jako zastępczego zastępowania ciągów o dynamicznym rozmiarze:

echo ${STR:6:$((${#STR} - 6 - 1))}

Szczegółowo:

  • ${#STR} zwraca długość łańcucha.
  • $((a - b - c)) robi odejmowanie matematyczne
  • ${STR:start:len} zwraca podłańcuch.

Tak więc drugim argumentem wyrażenia podłańcuchowego jest długość łańcucha minus początkowe przesunięcie minus wartość, którą określiłbyś jako wartość ujemną w nowszej składni bash.

Kayahr
źródło
2

$ {STR: 6: $ {# STR} -7} powinien być działającym zamiennikiem $ {STR: 6: -1}, jeśli STR ma gwarantować, że zawiera co najmniej 7 znaków. Jeśli może być krótszy, spowoduje to również, że bash OS X będzie narzekał na ujemne długości lub okropnie się popełni w przypadku wersji bash, które obsługują ujemne długości przyjmowane jako przesunięcia od prawej.

flabdablet
źródło
Dzięki, załatwiłem sprawę
Jean-Bernard Jansen
0

Zrobiłem to stąd :

Mówią, że ${STR:6:$#-1}powinno działać dobrze

W moim przypadku, z podobnym błędem ${VERSION::-2}, po prostu zaczął pracę po dodaniu 0 takiego: ${VERSION:0:-2}.

Aleksei Tselishchev
źródło