Eliminar la cadena inicial en bash

10

Tengo una cadena como rev00000010y solo quiero el último número, 10 en este caso.

He intentado esto:

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

ambos no devuelven nada, aunque la expresión regular parece ser correcta (intentado con regexr )

Michael Niemand
fuente
relacionado: stackoverflow.com/questions/16623835/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

16

Los comandos que pasó sedsignifican: si una línea coincide con la expresión regular, elimínela . Eso no es lo que quieres.

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

Esto significa: en cada línea, elimine revoluciones seguido de cualquier número de ceros.

Además, no necesitas seduna cosa tan simple. Simplemente use bash y su expansión de parámetros :

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
fuente
5

POSIXY:

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

Eliminaría todos los elementos a la izquierda del dígito más a la izquierda que no sea cero.

Bournely / universalmente:

number=`expr "x$test" : 'xrev0*\(.*\)'`
Stéphane Chazelas
fuente
El primero se romperá con puntos, hexadecimal, espacios, etc.: test='rev 003A0.1056'producirá number="3A0.1056". El segundo se romperá en cualquier espacio, producirá el mismo valor: 003A0.1056desde el expr.
3

Si ya tiene la prueba TEST variable, simplemente imprímala con todas las letras eliminadas

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

o

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

No utilice %dni echoordene porque los números con los principales 0se entienden comooctal

Costas
fuente
2

Algunas opciones más (aunque también le recomiendo que use la expansión de parámetros como lo sugiere @choroba):

  • Use sedo perlpara reemplazar todo excepto los dos últimos caracteres con los dos últimos caracteres. Esto elimina efectivamente todo excepto los dos últimos.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Establezca awkel delimitador de campo en 2 o más 0s e imprima el último campo:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Extraiga solo los dos últimos caracteres:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Imprima solo los últimos 10 bytes:

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

Tenga en cuenta que todo el uso anterior, <<<$varque es una construcción bash. Para usarlo en otros proyectiles, cambie a echo "$TEST" | command.

terdon
fuente
1
Para awk otra variante que puede evitar algún problemaawk -F"[a-z]" '{print +$NF}'
Costas
0

Para obtener el "último número", seleccione cualquier secuencia de dígitos al final de la cadena y conviértala en un número decimal:

Con Bash:

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

Con grep:

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

fuente