Reformatez l’affichage d’un nombre dans une ligne de fichier texte avec sed

J’ai un fichier texte qui a plusieurs lignes et je cherche à remplacer les lignes qui sont formatées comme:

cat: -0600, dog: +0900 cat: -1000, snake: -0500 cat: -0900 cat: +0100 

dire

 cat: -6, dog: +0900 cat: -10, snake: -0500 cat: -9 cat: +1 

il y a d’autres lignes qui sont:

 dog: -0700 dog: +1000 

cela ne devrait pas être touché. J’ai cherché, je ne peux pas tout comprendre. Préférez utiliser sed, sauf s’il y a une meilleure façon.

Compte tenu de votre fichier de données composite, ce script donne l’exemple de sortie ci-dessous:

 sed 's/^\(cat: [-+]\)0\{0,1\}\([1-9]\{0,1\}[0-9]\)00/\1\2/' data 

Il recherche cat: suivi d’un + ou - , puis d’un 0 optionnel (qui n’est pas capturé), puis d’un [1-9] optionnel suivi [0-9] suivi de deux 0 et remplace celui des deux pièces rappelées. Il convertirait +0000 à +0 . Si les deux derniers chiffres ne sont pas toujours 00 , modifiez la première expression régulière pour qu’elle corresponde à [0-5][0-9] ou [0-9][0-9] .

Sortie de l’échantillon:

 cat: -6, dog: +0900 cat: -10, snake: -0500 cat: -9 cat: +1 dog: -0700 dog: +1000 

Deux expressions devraient faire que cela fonctionne:

sed 's|^cat: -0600|cat: -6|; s|^dog: -0700|dog: -7|;' file

Je le ferais avec awk, je ne sais pas si vous pensez que c’est une meilleure façon:

 awk '/^cat: /{$2/=100}7' file 

tester avec votre entrée:

 kent$ echo "cat: -0600 cat: -1000 cat: -0900 cat: +0100 dog: -0700 dog: +1000"|awk '/^cat: /{$2/=100}7' cat: -6 cat: -10 cat: -9 cat: 1 dog: -0700 dog: +1000 

si vous voulez vraiment avoir un plus ” + ” avant les nombres positifs:

 awk '/^cat: /{$2/=100;$2=$2>0?"+"$2:$2}7' file 

même entrée:

 kent$ echo "cat: -0600 cat: -1000 cat: -0900 cat: +0100 dog: -0700 dog: +1000"|awk '/^cat: /{$2/=100;$2=$2>0?"+"$2:$2}7' cat: -6 cat: -10 cat: -9 cat: +1 dog: -0700 dog: +1000