Script shell pour extraire une un nombre et le doubler

Lte_blizzard -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je débute en programmation shell et je galère pas mal! J'aurais besoin d'un coup de main.
Voilà, dans un dossier, j'ai un certain nombre de fichiers de structures identiques, contenant un nombre qui varie et que je dois multiplier par deux.

En gros voici l'un de ces fichiers:

[DURATION]
InSecond=30
[MODULES]
[...]

Le nombre à droite d'InSecond doit être doublé. Je dois faire ça pour tous les fichiers, sachant que ce nombre peut varier mais il se trouve toujours au même endroit.

Merci de votre aide

Je précise au cas où qu'il s'agit d'un script sh à exécuter sous cygwin...

A voir également:

3 réponses

bla
 
Pas la plus belle des manières mais qui marche en bash et awk:

for file in ./*;do awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' $file > $file;done

Attention les nouveau fichiers écrasent les anciens
1
Lte_blizzard
 
merci pour cette réponse hyper rapide

J'ai ajouté ton code dans mon script double_duration.sh mais j'ai le résultat suivant:
$ ./double_duration.sh
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found

Y-a-il quelque chose à paramétrer?
0
Lte_blizzard
 
je précise du coup que j'ai nommé mon fichier file.txt dans un premier temps pour tester la commande...
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Salut,

Oui, installer "awk" ;-\
0
bla
 
La commande liste tout les fichiers du répertoire et les envois un part un à la commande awk.
Il faut que tu installe awk pour cygwin et tu n'as pas besoin de renommer les fichiers, il prend tout les fichiers du répertoire.
0
bla
 
Pour un seul fichier tu peux tester avec : awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' ton_fichier
0
Utilisateur anonyme
 
ATTENTION
Non seulement ça va les écraser, mais ça va même les vider, car la redirection intervient avant la lecture.
Donc, awk va lire un fichier vide :(

Il faut utiliser un fichier temporaire, puis le copier sur le fichier original.
1
Lte_blizzard
 
merci pour cette précision, je me suis fait un répertoire temporaire pour éviter de tout péter avec mes essais
0
lte_blizzard
 
Et comment faire pour paramétrer DES fichiers temporaires?
0
Utilisateur anonyme
 
au lieu de rediriger $file >$file

tmpF=/tmp/fichier.tmp
for file in ./*
do
   awk ... "$file" > "$tmpF"
   cp "$tmpF" "$file"
done
0
lte_blizzard
 
Ajout de la nouvelle redirection:

for file in ./*;do awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' $file > "tmp";cp "tmp" "$file";done

C'est nikel, le nombre est bien doublé dans chaque fichier!
Merci encore!
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
en perl, avec sauvegarde des fichers en .bak
perl -i.bak -pe 's/(^InSecond=)([0-9]+)/sprintf("%s%d", $1, $2*2)/e' fichiers*
0