Forum Linux.debian/ubuntu script avec commende sed ou awk

Posté par  .
Étiquettes : aucune
0
18
juin
2006
Bonjour à tous,

Je suis en train d'écrire un script shell qui a pour but les actions suivantes:

Modifier les valeurs d'un champs dans un fichier.

Ex:
La ligne de commande permettra de choisir la valeur de m1 a remplacé dans le fichier

Valeur de m1: 50

Résultat:

Dans le fichier, toutes les valeurs de m1 seront donc remplacée par 50

Voici la commande que j'avais trouvé pour faire cela:

sed 's/arg1/arg2/g 'file1|>file2

Cependant ça ne fonctionne pas car si j'ai plusieurs valeur de m1 dans le fichier...toutes ne seront pas remplacée

Je sais que l'on peux faire ça avec awk, par contre je ne m'en sort pas pour écrire cela. Quelqu'un aurait-il déjà résolu ce genre de pb

Merci à tous pour votre aide.
@+
  • # ma technique...

    Posté par  . Évalué à 2.

    ... quand j'ai ce genre de modification à faire est la suivante :

    cat file1 | sed -e s/arg1/arg2/g >file2

    attention aux espaces ou caracteres speciaux dans les args
    sinon garanti sur facture
    • [^] # Re: ma technique...

      Posté par  . Évalué à 1.

      Merci pour ta réponse... mais je pense que je me suis mal exprimé.

      En fait mon souci ne se situe pas à se niveau.

      Mais mon souci est le suivant:

      lorsque je lance ma commande, je dis: remplacer toutes les occurences de m1 = 25 par 50 par exemple
      (ce qui donne avec ta commande : cat file1 | sed -e s/arg1/arg2/g >file2). Cela marche très bien

      Mais toutes les occurences de m1 ne sont pas égales à 25 dans mon fichier. Ce que je voudrai et que je n'arrive pas à faire, c'est remplacer toutes les occurences de m1, quelque soit leur valeur (25 ou autre) par 50 (dans mon exemple)

      d'avance merci.
      • [^] # Re: ma technique...

        Posté par  . Évalué à 1.

        Peut-être :
        $ sed "s# m1 = .*#m1 = 25#g" file1 > file2

        Explications :
        Déjà, ton cat ne sert à rien, sed gère ça d'entrée de jeu....
        On peut mettre n'importe quoi comme caractère pour la commande de substitution, et j'avais envie de changer....
        On recherche une chaîne qui ressemble à m1 = suivie de ... peu importe, et on remplace le tout par m1 = 50.
        Voilà, j'espère que ça répond à ton problème.
        • [^] # Re: ma technique...

          Posté par  . Évalué à 1.


          Peut-être :
          $ sed "s# m1 = .*#m1 = 25#g" file1 > file2


          recherche une chaîne qui ressemble à m1 = suivie de ... peu importe, et on remplace le tout par m1 = 50


          enfin par m1 = 25 tu voulais dire ;-)

          ok je chipotte, mais sinon belle explication.
          j'avais hesité pour le coup de sed qui accepterait n'importe quel separateur.

          Ainsi la ligne peut s'ecrire :
          $ sed "s# m1 = .*#m1 = 25#g" file1 > file2
          $ sed "s@m1 = .*@m1 = 25@g" file1 > file2
          $ sed "s/m1 = .*/m1 = 25/g" file1 > file2
          $ sed "sxm1 = .*xm1 = 25xg" file1 > file2

          mais la derniere est peu lisible :-/
          • [^] # Re: ma technique...

            Posté par  . Évalué à 1.

            Merci à tous pour vos réponses et pour votre aide...

            Je chipotte aussi...lol en fait je voudrai rendre ça encore plus dynamique en faisant ceci:

            $ m1 = ....

            L'utilisateur saisit la valeur en ligne de commande et toutes les valeurs se changent dans le fichier.

            Cela est-il possible à réaliser ?

            encore merci
            • [^] # Re: ma technique...

              Posté par  . Évalué à 1.

              Ben oui, c'est possible !
              Quel que soit le shell utilisé, si l'utilisateur en question tape :
              $ m1=75
              $ sed "s#m1 = .*#m1 = $m1#g" fichier1 > fichier2
              ça fait ce que tu demandes.
              A partir de là, rien ne t'empêche d'écrire un script-shell qui reproduise l'ensemble des commandes.
              Je te conseille de jeter un oeil aux pages de manuel de ton shell pour voir comment on procède pour demander une valeur interactivement.
              Ainsi, un truc dans ce genre :

              #!/bin/bash
              echo -n "Valeur de m1 : "
              read m1
              sed "s#m1 = .*#m1 = $m1#g" fichier1 > fichier2

              Devrait faire l'affaire.
              Libre à toi d'y ajouter tous les contrôles d'erreurs dont tu pourrait avoir besoin.
              Voilà, en espérant que ça aide.
    • [^] # Re: ma technique...

      Posté par  . Évalué à 2.

      cat file1 | sed -e s/arg1/arg2/g >file2

      NON !

      sed -e s/arg1/arg2/g file1 >file2

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.