Script remplacer ligne + champ

Résolu
Bonjour,
je cherche a ecrire un script qui me permet :
de remplacer une ligne par une autre selon un mot clé, et aussi de modifier un des cjamps, par exemple:
cat plop
ligne1
1 2 3 4 5 6 7
ligne3 toto
ligne4 tata
ligne5 titi

je voudrais modifier la ligne qui contient le mot clé "titi", en remplaçant toute la ligne de cette manière:
"ligne5 titi" devient "ligne6 tutu"

je voudrais également remplacer le 5eme champ de la ligne 2, de cette manière:
"1 2 3 4 5 6 7" devient "1 2 3 4 8 6 7"

Merci pour vos réponses à venir !

18 réponses

  1. oui j'ai bien la solution pour insérer du texte après un mot clé, mais pas pour remplacer la ligne contenant le mot clé...
    1. alors j'ai réussi la 1ere partie consistant à remplacer une ligne par une autre (par l'intermediaire de 2 commandes sed, une qui insere ma ligne avant la ligne a supprimer, une qui supprime la ligne en question)
      par contre concernant la 2eme partie...je coince !
      voila mon besoin :
      je voudrais également remplacer le 5eme champ de la ligne 2, de cette manière:
      "1 2 3 4 5 6 7" devient "1 2 3 4 8 6 7"
      1. Modérateur
        par l'intermediaire de 2 commandes sed,
        Avec une seule commande ça suffit amplement :

        [tmpfs]$ cat plop
        ligne1
        1 2 3 4 5 6 7
        ligne3 toto
        ligne4 tata
        ligne5 titi
        [tmpfs]$ sed -i.BAK '/titi/c\
        ligne6 tutu
        ' plop
        [tmpfs]$ cat plop
        ligne1
        1 2 3 4 5 6 7
        ligne3 toto
        ligne4 tata
        ligne6 tutu
        [tmpfs]$

        ;-))
        1. ok ca c'est la solution simplifiée pour résoudre mon 1er probleme (deja resolu)
          mais concernant le 2nd ?
          j'ai une piste pour isoler mon champ a modifier, mais je n'arrive pas a le modifier...
          head -2 plop | tail -1 | awk '{print $5}'
          1. Modérateur
            [tmpfs]$ cat plop
            ligne1
            1 2 3 4 5 6 7
            ligne3 toto
            ligne4 tata
            ligne6 tutu
            [tmpfs]$ sed -i.ORIG '2 s/. /8 /5' plop
            [tmpfs]$ cat plop
            ligne1
            1 2 3 4 8 6 7
            ligne3 toto
            ligne4 tata
            ligne6 tutu
            [tmpfs]$
            1. alors ca marche dans ce cas précis, mon souci, c'est que j'ai plusieurs fichiers a traiter...et que je veux modifier le 5eme champ de la ligne 2 (et non pas le chiffre 5), d'ou mon choix de awk !
              1. Modérateur
                Ben mon exemple modifie le 5ème champ (enfin la 5ème occurrence comprenant un caractère suivi d'un espace pour être précis) et non pas le chiffre 8 !

                [tmpfs]$ cat plop
                ligne1
                1 2 3 4 8 6 7
                ligne3 toto
                ligne4 tata
                ligne6 tutu
                [tmpfs]$ sed  '2 s/. /3 /5' plop
                ligne1
                1 2 3 4 3 6 7
                ligne3 toto
                ligne4 tata
                ligne6 tutu
                [tmpfs]$
                1. ha oui en effet mon problème vient de la, c'est que mes fichiers ne sont pas forcement formatés de la meme facon....
                  cat plop
                  ligne1
                  1 2 3 4 5 6 7

                  cat plop1
                  ligne1
                  1 2 3 4 5 6 7

                  cat plop2
                  ligne1
                  1 2 3 4 5 6 7
                  1. je ne sais pas pourquoi ca ne se voit pas, mais il y a plus d'espaces entre les chiffres dans plop1 et plop2 !
                    1. Modérateur
                      Faut coller ton texte entre les balises "<code>TON TEXTE ICI</code>"
                      1. je disais donc :
                        ha oui en effet mon problème vient de la, c'est que mes fichiers ne sont pas forcement formatés de la meme facon....
                        cat plop
                        ligne1
                        1 2 3 4 5 6 7
                        
                        cat plop1
                        ligne1
                        1   2 3  4 5   6 7
                        
                        cat plop2
                        ligne1
                        1 2  3 4   5   6 7
                        
                        1. je reviens sur le sujet, vous voyez le probleme pour plop2 par exemple ?
                          si j'effectue :
                          sed '2 s/. /3 /7' plop2
                          j'obtiens:
                          ligne1
                          1 2  3 4   5 3 6 7
                          

                          ceci a cause de l'interpretation des espaces
                          1. Modérateur
                            Il te faut voir du côté de "awk" pour traiter les champs... "sed" n'étant plus/pas du tout adapté pour ce genre de traitement.
                            1. c bien ce que je pensais, g un debut avec
                              head -2 plop | tail -1 | awk '{print $5}'
                              mais je ne vois pas comment remplacer ce 5eme champ...(qui peut voir + d'un caractere !)
                              sinon je ne vois pas non plus, du coté de sed, comment remplacer tous les champs commencant pas "2009" ?
                              du style :
                              sed '2 s/2009*/20100708/' plop
                              mais le "*" remplace simplement ce qu'il y a apres 2009
                              1. Modérateur
                                Pour "awk", désolé je ne peux pas t'aider ;-(

                                Par contre pour "sed" que veux-tu faire exactement ?

                                Merci de poster un exemple AVANT => APRES
                                1. merci c'est ok j'ai utilisé sed et je modifie toute la fin de ligne (qui sera identique pour tous mes fichiers):
                                  sed -i '2 s/2009.*/20100708 )/' plop