Eu tenho uma variável var
em um script Bash segurando uma string, como:
echo $var
"some string.rtf"
Desejo remover os últimos 4 caracteres dessa string e atribuir o resultado a uma nova variável var2
, para que
echo $var2
"some string"
Como posso fazer isso?
Respostas:
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á usarvar2=${var%.rtf}
. Se você não sabe qual é o sufixo, mas deseja remover tudo que começa com o último.
, pode usarvar2=${var%.*}
. Se você quiser apenas manter tudo atualizado.
, pode usarvar2=${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 de4
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.fonte
Você pode fazer assim:
fonte
bash
4+, mas na versão anterior você pode usar um pouco mais${v::${#v}-4}
.${v::-4}
croaks "zsh: fechamento esperado". Mas a resposta de @fredtantini abaixo${v:0:-4}
funciona bem.Para remover quatro caracteres do final da cadeia, use
${var%????}
.Para remover tudo após o
.
uso final${var%.*}
.fonte
${var#????}
.O que funcionou para mim foi:
Mas eu o usei para aparar linhas em um arquivo, e é por isso que parece estranho. O uso real foi:
cut
apenas leva você a recuar de alguma posição inicial, o que é ruim se você precisar de linhas de comprimento variável. Portanto, essa solução inverte (rev
) a string e agora nos relacionamos com sua posição final, depois a usacut
como mencionado e a reverte (de novorev
) para sua ordem original.fonte
rev
inverte linhas, não cordas.echo $SOME_VAR | rev | ...
provavelmente não se comportará como seria de esperar.Usando expansão variável / substituição de substring :
Então você pode fazer:
Alternativamente,
Se você tem sempre as mesmas 4 letras
Se está sempre terminando em
.xyz
:Você também pode usar o comprimento da string:
ou simplesmente
echo ${var::-4}
fonte
len=${#var}; echo ${var::len-4}
poderia ser reduzido paraecho ${var:0:-4}
:-) EDIT: ou como @iyonizer apontou, apenasecho ${var::-4}
...Você poderia usar sed,
Exemplo:
fonte
var2
?Eu tentei o seguinte e funcionou para mim:
Resultado:
hel
fonte
Espero que o exemplo abaixo ajude,
echo ${name:0:$((${#name}-10))}
->${name:start:len}
start
é o ponto inicial da stringlen
é o comprimento da string que deve ser removida.Exemplo:
Resultado:
Nota: O Bash 4.2 adicionou suporte para substring negativo
fonte
Isso funcionou para mim, calculando o tamanho da string.
É fácil ecoar o valor que você precisa retornar e depois armazená-lo como abaixo
fonte
Nesse caso, você pode usar o nome da base, assumindo que possui o mesmo sufixo nos arquivos que deseja remover.
Exemplo:
Se você não conhece o sufixo e deseja remover tudo depois e incluindo o último ponto:
% significa costeleta,. é o que você está cortando, * é curinga
fonte