Script shell pour extraire une un nombre et le doubler

Lte_blizzard -  
dubcek Messages postés 18627 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...

3 réponses

  1. 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
    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
    2. Lte_blizzard
       
      je précise du coup que j'ai nommé mon fichier file.txt dans un premier temps pour tester la commande...
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Oui, installer "awk" ;-\
      0
    4. 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
    5. bla
       
      Pour un seul fichier tu peux tester avec : awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' ton_fichier
      0
  2. 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
    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
    2. lte_blizzard
       
      Et comment faire pour paramétrer DES fichiers temporaires?
      0
    3. Utilisateur anonyme
       
      au lieu de rediriger $file >$file

      tmpF=/tmp/fichier.tmp
      for file in ./*
      do
         awk ... "$file" > "$tmpF"
         cp "$tmpF" "$file"
      done
      0
    4. 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
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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