Primeiro, você deve ser explícito sobre o que deseja. Se você souber que a sequência termina .rtf
e deseja remover a .rtf
, poderá usar var2=${var%.rtf}
. Se você não sabe qual é o sufixo, mas deseja remover tudo que começa com o último .
, pode usar var2=${var%.*}
. Se você quiser apenas manter tudo atualizado .
, pode usar var2=${var%%.*}
. Essas duas últimas opções terão o mesmo resultado se houver apenas um período, mas se houver mais de um, você deve decidir qual deseja.
Se você realmente deseja sempre remover um número exato de caracteres, aqui estão algumas opções.
Você especificou o bash especificamente, portanto, começaremos com os bash builtins. O que funcionou por mais tempo é a mesma sintaxe de remoção de sufixo que usei acima: para remover quatro caracteres, use var2=${var%????}
. Você precisa de um ponto de interrogação por caractere removido, portanto, isso fica complicado para comprimentos de substring maiores.
Ligeiramente mais recente é substring extração: var2=${var::${#var}-4}
. Aqui você pode colocar qualquer número no lugar de 4
para remover um número diferente de caracteres. (O ${#var}
é substituído pelo comprimento da string, portanto, na verdade, é necessário manter os primeiros caracteres (comprimento - 4).)
Versões mais recentes do bash (especificamente 4+, o que significa que o MacOS não funciona) permite simplificar isso apenas var2=${var::-4}
.
Se você não estiver realmente usando o bash, mas algum outro shell do tipo POSIX, a remoção do sufixo ainda funcionará, mesmo em traços antigos simples (onde nenhum dos outros funcionará). Em zsh, todos eles funcionam, mas você tem que colocar um 0
entre os dois pontos: var2=${var:0:-4}
etc. Em ksh, é necessário o 0 e também tem que usar a explícita comprimento-4 expressão: var2=${var:0:${#var}-4}
.
Obviamente, você pode usar a substituição de comandos para fazê-lo com a ajuda de um programa utilitário; há muitos que funcionarão, mas algo como var2=$(cut -c -4 <<<"$var")
provavelmente é a opção mais curta.