Bash 4.3 Comprimento negativo da string no OS X


12

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?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - o que foi adicionado quando, começando com v2, v3 e v4, segue.
Hannu

@ Hannu sim, esse documento diz que a semântica de comprimento negativo foi adicionada na versão 4.2
Brent Faust

Eu tenho o mesmo problema: você encontrou uma maneira de lidar com isso?
Romain Jouin

@romainjouin Apenas alterando o algoritmo. Essa sintaxe simplesmente não funciona no OX X, mesmo na versão 4.3.46 do Bash! Faça um voto positivo na pergunta para tentar obter mais detalhes sobre isso. Alguém sabe a resposta ...
Brent Faust

1
@Rubistro Basta clicar aqui: | Uma maneira de contornar isso é (no seu exemplo)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Respostas:


7

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:

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.

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.


2

$ {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.


Thx, fez o truque para mim
Jean-Bernard Jansen

0

Pesquisado a partir daqui :

Eles dizem que ${STR:6:$#-1}deve funcionar bem

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.