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. Modérateur
    Salut,

    Tu n'as rien trouvé par toi même ? Ne serait-ce qu'une bribe ?

    C'est un peu le même principe ;-\
    0
    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é...
      0
      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"
        0
        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]$

          ;-))
          0
          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}'
            0
            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]$
              0
              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 !
                0
                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]$
                  0
                  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
                    0
                    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 !
                      0
                      1. Modérateur
                        Faut coller ton texte entre les balises "<code>TON TEXTE ICI</code>"
                        0
                        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
                          
                          0
                          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
                            0
                            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.
                              0
                              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
                                0
                                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
                                  0
                                  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
                                    0