Entfernen Sie die führende Zeichenfolge in Bash

10

Ich habe eine Zeichenfolge wie rev00000010und ich möchte nur die letzte Zahl, in diesem Fall 10.

Ich habe das versucht:

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

beide geben nichts zurück, obwohl der Regex korrekt zu sein scheint (versucht mit Regexr )

Michael Niemand
quelle
Verwandte: stackoverflow.com/questions/16623835/…
Ciro Santilli 13 病毒 审查 六四 事件 法轮功

Antworten:

16

Die Befehle, die Sie übergeben haben, sedbedeuten: Wenn eine Zeile mit dem regulären Ausdruck übereinstimmt, löschen Sie sie . Das willst du nicht.

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

Dies bedeutet: Entfernen Sie in jeder Zeile die Umdrehung, gefolgt von einer beliebigen Anzahl von Nullen.

Auch sedfür so eine einfache Sache brauchen Sie nicht . Verwenden Sie einfach bash und seine Parametererweiterung :

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

POSIXly:

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

Würde alles links von der am weitesten links stehenden Ziffer ungleich Null entfernen.

Bournely / universell:

number=`expr "x$test" : 'xrev0*\(.*\)'`
Stéphane Chazelas
quelle
Der erste wird mit Punkten, Hex, Leerzeichen usw. brechen: test='rev 003A0.1056'wird produzieren number="3A0.1056". Der zweite wird auf einem beliebigen Leerzeichen 003A0.1056unterbrochen , der gleiche Wert wird erzeugt: aus dem Ausdruck.
3

Wenn Sie die Variable TEST bereits haben, drucken Sie sie einfach mit entferntem Buchstaben aus

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

oder

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

Verwenden Sie nicht %doder echo-Befehl, da Zahlen mit führenden 0als verstanden werdenoctal

Costas
quelle
2

Einige weitere Optionen (obwohl ich auch empfehle, die von @choroba vorgeschlagene Parametererweiterung zu verwenden):

  • Verwenden Sie sedoder perl, um alles außer den letzten beiden Zeichen durch die letzten beiden Zeichen zu ersetzen. Dies löscht effektiv alles außer den letzten beiden.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Setzen Sie awkdas Feldtrennzeichen auf 2 oder mehr Nullen und drucken Sie das letzte Feld:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Extrahieren Sie nur die letzten beiden Zeichen:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Drucken Sie nur die zehntletzten Bytes:

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

Beachten Sie, dass alle oben genannten Verwendungen <<<$varein Bash-Konstrukt sind. Um es in anderen Shells zu verwenden, wechseln Sie zu echo "$TEST" | command.

terdon
quelle
1
Für awk andere Variante, die ein Problem vermeiden kannawk -F"[a-z]" '{print +$NF}'
Costas
0

Um die "letzte Zahl" zu erhalten, wählen Sie eine beliebige Ziffernfolge am Ende der Zeichenfolge aus und konvertieren Sie sie in eine Dezimalzahl:

Mit Bash:

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

Mit grep:

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

quelle