Remover string inicial no bash


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.

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*\(.*\)'`

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


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.


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]*$"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.