Comprimento negativo da substring Bash 4.3 no OS X

Comprimento negativo da substring Bash 4.3 no OS X

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}.

informação relacionada