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