Remover string inicial no bash

10

Eu tenho uma string como rev00000010e só quero o último número, 10 neste 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 )

Michael Niemand
fonte
related: stackoverflow.com/questions/16623835/…
Ciro Santilli escreveu

Respostas:

16

Os comandos que você passou para sedsignificar: se uma linha corresponder ao regex, exclua-o . Não é isso que você quer.

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

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

Além disso, você não precisa sedde uma coisa tão simples. Basta usar o bash e sua expansão de 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.
choroba
fonte
5

POSIXly:

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

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

Bournely / universalmente:

number=`expr "x$test" : 'xrev0*\(.*\)'`
Stéphane Chazelas
fonte
O primeiro quebrará com pontos, hexadecimal, espaços, etc: test='rev 003A0.1056'será produzido number="3A0.1056". O segundo quebrará em qualquer espaço, o mesmo valor produzirá: a 003A0.1056partir do expr.
3

Se você já possui a variável TEST, imprima-a com todas as letras removidas

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

ou

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

Não use %dou echocomando porque os números com iniciais 0são entendidos comooctal

Costas
fonte
2

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

  • Use sedou perlpara substituir tudo, exceto os dois últimos caracteres pelos dois últimos. Isso efetivamente exclui tudo, exceto os dois últimos.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Defina awko delimitador de campo como 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
    
  • Imprima apenas o décimo último bytes:

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

Observe que todos os itens acima usam <<<$varuma construção bash. Para usá-lo em outras conchas, mude para echo "$TEST" | command.

terdon
fonte
1
Para awk outra variante que pode evitar algum problemaawk -F"[a-z]" '{print +$NF}'
Costas
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 o Bash:

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

Com grep:

echo "$test" | grep -Po "[1-9][0-9]*$"

fonte