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. 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
    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. 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
          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. 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. 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. Modérateur
                Faut coller ton texte entre les balises "<code>TON TEXTE ICI</code>"
                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. 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. 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. 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
                          [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. 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
                              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. 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. 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. 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