Rimuovi la stringa iniziale in bash


10

Ho una stringa come rev00000010e voglio solo l'ultimo numero, 10 in questo caso.

Ho provato questo:

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

entrambi non restituiscono nulla, anche se il regex sembra essere corretto (provato con regexr )


Risposte:


16

I comandi che hai passato sedsignificano: se una riga corrisponde alla regex, eliminala . Non è quello che vuoi.

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

Questo significa: su ogni riga, rimuovere rev seguito da un numero qualsiasi di zero.

Inoltre, non è necessario sedper una cosa così semplice. Usa bash e la sua espansione dei parametri :

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]*}"}

Rimuoverebbe ogni cosa a sinistra della cifra diversa da zero più a sinistra.

Bournely / universalmente:

number=`expr "x$test" : 'xrev0*\(.*\)'`

Il primo si romperà con punti, esagoni, spazi, ecc.: test='rev 003A0.1056'Produrrà number="3A0.1056". Il secondo si spezzerà su qualsiasi spazio, lo stesso valore produrrà: 003A0.1056dall'espr.

3

Se hai già la variabile TEST basta stamparla con tutta la lettera rimossa

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

o

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

Non usare %do echo-comporre i numeri perché i numeri iniziali 0sono intesi comeoctal


2

Alcune altre opzioni (anche se ti consiglio anche di utilizzare Parameter Expansion come suggerito da @choroba):

  • Usa sedo perlper sostituire tutto tranne gli ultimi due caratteri con gli ultimi due caratteri. Questo elimina efficacemente tutto tranne gli ultimi due.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Impostare awkil delimitatore di campo su 2 o più 0 e stampare l'ultimo campo:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Estrai solo gli ultimi due caratteri:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Stampa solo gli ultimi 10 byte:

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

Nota che tutto quanto sopra <<<$varè un costrutto bash. Per usarlo in altre shell, cambia in echo "$TEST" | command.


1
Per awk altra variante che può evitare qualche problemaawk -F"[a-z]" '{print +$NF}'
Costas,

0

Per ottenere "l'ultimo numero", seleziona una sequenza di cifre alla fine della stringa e convertila in un numero decimale:

Con Bash:

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

Con grep:

echo "$test" | grep -Po "[1-9][0-9]*$"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.