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?
bash
string-manipulation
Brent Faust
źródło
źródło
echo "Hello World" | rev | cut -c -5 | rev
Odpowiedzi:
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:
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.
źródło
$ {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.
źródło
Zrobiłem to stąd :
Mówią, że
${STR:6:$#-1}
powinno działać dobrzeW moim przypadku, z podobnym błędem
${VERSION::-2}
, po prostu zaczął pracę po dodaniu 0 takiego:${VERSION:0:-2}
.źródło