Bash 4.2 adicionou suporte para comprimentos de substring negativos:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
Exemplo 37-12. Parâmetro negativo na construção de extração de string
Quando o parâmetro "comprimento" é negativo, ele serve como parâmetro de deslocamento do final.
Por exemplo, as seguintes saídas são "World" quando testadas no Ubuntu:
STR="Hello World!"
echo ${STR:6:-1}
Mas no OS X (GNU bash, versão 4.3.42(1)-release (x86_64-apple-darwin14.5.0)), esse uso produz o seguinte erro:
-1: substring expression < 0
Este OS X é específico ou foi desativado novamente em atualizações posteriores do bash? Existe uma maneira de ativar essa funcionalidade para o OS X?
Responder1
Embora a solução do flabdablet funcione apenas para strings de comprimento fixo, você pode usá-la como um substituto imediato para strings de tamanho dinâmico:
echo ${STR:6:$((${#STR} - 6 - 1))}
Em detalhe:
${#STR}
retorna o comprimento da string.$((a - b - c))
faz subtração matemática${STR:start:len}
retorna uma substring.
Portanto, combinado o segundo argumento para a expressão de substring é o comprimento da string menos o deslocamento inicial menos o valor que você especificaria como valor negativo na sintaxe bash mais recente.
Responder2
${STR:6:${#STR}-7} deve ser um substituto funcional para ${STR:6:-1} se for garantido que STR contenha pelo menos 7 caracteres. Se puder ser mais curto, isso também fará com que o OS X bash reclame sobre comprimentos negativos ou dê terrivelmente errado nas versões do bash que suportam comprimentos negativos sendo considerados deslocamentos da direita.
Responder3
É possível cortar no final de forma dinâmica usando o comprimento como entrada para calcular.
${STR:0:${#STR}-2}
O -2 é o valor negativo.
Responder4
Pesquisado no Google emaqui:
Eles dizem ${STR:6:$#-1}
que deveria funcionar bem
No meu caso, com um erro semelhante ${VERSION::-2}
, simplesmente começou a funcionar depois de adicionar 0 assim: ${VERSION:0:-2}
.