remove a cadeia principal no bash

6

Eu tento fazer com que esse comando sed funcione.

Eu tenho uma string como rev00000010

e eu só quero o último número, 10 nesse caso.

Eu tentei isso:

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

ambos não retornam nada, embora o regex pareça estar correto (tentado com regexr )

    
por Michael Niemand 13.11.2014 / 14:59

5 respostas

9

Os comandos que você passou para sed significam: se uma linha corresponder à regex, exclua-a . Não é isso que você quer.

echo "$TEST" | sed 's/rev0*//'

Isso significa: em cada linha, remover rev seguido por qualquer número de zeros.

Além disso, você não precisa de sed para uma coisa tão simples. Basta usar o bash e sua expansão do parâmetro :

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to 'rev'
                         # followed by the maximal number of zeroes.
    
por 13.11.2014 / 15:05
4

POSIXly:

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

Removeria tudo à esquerda do dígito diferente de zero à esquerda.

Bournely / universal:

number='expr "x$test" : 'xrev0*\(.*\)''
    
por 13.11.2014 / 15:48
3

Se você já tiver a variável TEST, imprima-a com toda a letra removida

printf "%.0f\n" ${TEST//[a-z]/}

ou

printf "%g\n" ${TEST//[a-z]/}

Não use %d ou echo -command porque os números com% principal0 são entendidos como octal

    
por 13.11.2014 / 16:03
2

Mais algumas opções (embora eu também recomendo que você use a Expansão de Parâmetros sugerida por @choroba):

  • Use sed ou perl para substituir tudo, exceto os dois últimos caracteres com os dois últimos caracteres. Isso efetivamente exclui tudo, exceto os dois últimos.

    $ sed -r 's/.*(..)//' <<<$TEST
    10
    $ perl -pe 's/.*(..)//' <<<$TEST
    10
    
  • Defina o delimitador de campo de awk para 2 ou mais 0s e imprima o último campo:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Extraia apenas os dois últimos caracteres:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Imprimir apenas os 10 últimos bytes:

    $ cut -b 10- <<<$TEST
    10
    

Observe que todos os itens acima usam <<<$var , que é uma construção bash. Para usá-lo em outros shells, mude para echo "$TEST" | command .

    
por 13.11.2014 / 15:29
0

Para obter o "último número", selecione qualquer sequência de dígitos no final da string e converta-a em um número decimal:

Com Bash:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

Com grep:

echo "$test" | grep -Po "[1-9][0-9]*$"
    
por 10.08.2015 / 08:27