Bash 4.3 Substring Negative Length no OS X

9

O Bash 4.2 adicionou suporte para comprimentos negativos de substring:

link

Example 37-12. Negative parameter in string-extraction construct

When the "length" parameter is negative, it serves as an offset-from-end parameter.

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

O OS X é específico ou foi desativado novamente em atualizações posteriores? Existe uma maneira de ativar essa funcionalidade para o OS X?

    
por Brent Faust 29.01.2016 / 23:42

2 respostas

2

$ {STR: 6: $ {# STR} -7} deve ser um substituto funcional para $ {STR: 6: -1} se STR tiver a garantia de pelo menos 7 caracteres. Se pudesse ser mais curto, isso também faria com que o OS X bash se queixasse de comprimentos negativos, ou fosse terrivelmente errado em versões bash que suportam comprimentos negativos sendo tomadas como compensações da direita.

    
por 09.01.2018 / 09:45
2

Embora a solução de flabdablet funcione apenas para strings de comprimento fixo, você pode usar isso como substituto fácil para strings de tamanhos dinâmicos:

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

Em detalhes:

  • ${#STR} retorna o tamanho da string.
  • $((a - b - c)) faz subtração matemática
  • ${STR:start:len} retorna uma subcadeia.

Então, o segundo argumento combinado à expressão de substring é o comprimento da string menos o offset inicial menos o valor que você especificaria como valor negativo na sintaxe mais recente do bash.

    
por 04.10.2018 / 11:20