Como removo os últimos caracteres de uma string?

6

Eu tenho uma variável definida com var='type_cardio_10-11-2017' . Preciso remover as últimas 10 letras da variável e anexar o valor restante a var2 .

Eu tentei com o seguinte script, mas não funciona como esperado.

var=type_cardio_10-11-2017
var2=${var} | cut -f1 -d "_"
echo ${var2}

A saída que eu quero é type_cardio .

    
por Rak kundra 20.10.2017 / 19:38

5 respostas

14

Para remover tudo depois do último _ em var e atribuir o resultado a var2 :

var2=${var%_*}

A expansão de parâmetro ${parameter%word} remove o padrão word ( _* neste caso) do final do valor da variável fornecida.

O padrão POSIX chama isso de expansão de parâmetro "Remover o menor padrão de sufixo" .

    
por 20.10.2017 / 19:49
9

Você realmente deseja remover os caracteres 11 da sequência; aqui está outra maneira de fazer isso:

$ var=type_cardio_10-11-2017
$ var2=${var%???????????}
$ echo "$var2"
type_cardio
    
por 20.10.2017 / 19:56
5

Outra abordagem em bash :

echo "${var::-10}"

Ou em versões mais antigas:

echo "${var::${#var}-10}" #or
echo "${var: : -10}"
    
por 20.10.2017 / 20:00
4

1) Solução bash :

var1="type_cardio_10-11-2017"
var2=${var1%_*}

2) Solução cut :

var1="type_cardio_10-11-2017"
var2=$(cut -d'_' -f1,2 <<<"$var1")
echo "$var2"

A saída:

type_cardio
    
por 20.10.2017 / 19:42
1

Anexar var e var2 é a parte fácil - você pode apenas se juntar a eles como new_var="$var$var2" . Se o que você realmente quis dizer é que você quer armazenar cortar var em var2 , então é só var2=$(...) e você pode colocar os comandos que outros usuários e minha resposta é apresentada aqui dentro da porção $() .

A parte principal é remover esses 10 caracteres. Há várias maneiras de extrair a parte desejada de var :

  • printf (bastante portátil, não depende de um shell específico)

    $ printf "%.11s\n"  "$var"                                                                                                                                                                      
    type_cardio
    
  • awk

    $ var=type_cardio_10-11-2017                                                                                                                                                                    
    $ awk -v awk_var="$var"  'BEGIN{print substr(awk_var,0,length(awk_var)-11)}'                                                                                                                    
    type_cardio
    

    ou você pode usar o truque printf aqui também:

    $ echo "$var" | awk '{printf "%.11s\n",$0}'                                                                                                                                                     
    type_cardio
    
  • egrep

    $ echo "$var" | egrep  -o '^.{0,11}'                                                                                                                                                           
    type_cardio
    
  • perl :

    $ echo "$var" | perl -lne 'print substr($_,0,11)'                                                                                                                                               
    type_cardio
    
  • python :

    $ python -c 'import sys;print sys.argv[1][0:11] ' "$var"                                                                                                                                        
    type_cardio
    
por 21.10.2017 / 19:15