O Bash 4.2 adicionou suporte para comprimentos negativos de substring:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
Exemplo 37-12. Parâmetro negativo na construção de extração de cadeia
Quando o parâmetro "length" é negativo, ele serve como um parâmetro offset-of-end.
Por exemplo, as seguintes saídas "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 do bash posteriores? Existe uma maneira de ativar essa funcionalidade para o OS X?
bash
string-manipulation
Brent Faust
fonte
fonte
echo "Hello World" | rev | cut -c -5 | rev
Respostas:
Enquanto a solução da flabdablet funciona apenas para strings de comprimento fixo, você pode usá-lo como um substituto para strings de tamanho dinâmico:
Em detalhe:
${#STR}
retorna o comprimento da string.$((a - b - c))
faz subtração matemática${STR:start:len}
retorna uma substring.Assim, o segundo argumento combinado à expressão de substring é o comprimento da sequência menos o deslocamento inicial menos o valor que você especificaria como valor negativo na sintaxe mais recente do bash.
fonte
$ {STR: 6: $ {# STR} -7} deve ser um substituto funcional para $ {STR: 6: -1} se for garantido que STR contém pelo menos 7 caracteres. Se puder ser mais curto, isso também fará com que o bash do OS X se queixe de comprimentos negativos ou dê errado horrivelmente nas versões do bash que suportam comprimentos negativos que são tomados como compensações da direita.
fonte
Pesquisado a partir daqui :
Eles dizem que
${STR:6:$#-1}
deve funcionar bemNo meu caso, com um erro semelhante
${VERSION::-2}
, ele simplesmente começou a trabalhar após a adição de 0 como este:${VERSION:0:-2}
.fonte