Supprimer la chaîne principale dans bash

10

J'ai une chaîne comme rev00000010et je ne veux que le dernier numéro, 10 dans ce cas.

J'ai essayé ceci:

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

les deux ne renvoient rien, bien que l'expression régulière semble être correcte (essayé avec regexr )

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

Réponses:

16

Les commandes que vous avez passées sedsignifient: si une ligne correspond à l'expression régulière, supprimez-la . Ce n'est pas ce que tu veux.

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

Cela signifie: sur chaque ligne, supprimez rev suivi de n'importe quel nombre de zéros.

De plus, vous n'avez pas besoin sedd'une chose aussi simple. Utilisez simplement bash et son extension de paramètre :

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
la source
5

POSIX:

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

Supprime tout à gauche du chiffre non nul le plus à gauche.

Bournely / universellement:

number=`expr "x$test" : 'xrev0*\(.*\)'`
Stéphane Chazelas
la source
Le premier rompra avec les points, hex, espaces, etc: test='rev 003A0.1056'produira number="3A0.1056". La seconde se cassera sur n'importe quel espace, la même valeur produira: à 003A0.1056partir de l'expr.
3

Si vous avez déjà la variable TEST, imprimez-la avec toutes les lettres supprimées

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

ou

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

Ne pas utiliser %dou echo-commander parce que les chiffres avec des interlignes 0sont compris commeoctal

Costas
la source
2

Quelques options supplémentaires (bien que je vous recommande également d'utiliser l'extension des paramètres comme suggéré par @choroba):

  • Utilisez sedou perlpour tout remplacer sauf les deux derniers caractères par les deux derniers caractères. Cela supprime efficacement tout sauf les deux derniers.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Définissez awkle délimiteur de champ de 2 ou plusieurs 0 et imprimez le dernier champ:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Extraire uniquement les deux derniers caractères:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Imprimer uniquement les 10 derniers octets:

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

Notez que tout ce qui précède utilise <<<$varune construction bash. Pour l'utiliser dans d'autres coques, passez à echo "$TEST" | command.

terdon
la source
1
Pour awk autre variante qui peut éviter certains problèmesawk -F"[a-z]" '{print +$NF}'
Costas
0

Pour obtenir le "dernier nombre", sélectionnez une séquence de chiffres à la fin de la chaîne et convertissez-la en nombre décimal:

Avec Bash:

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

Avec grep:

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

la source