Script remplacer ligne + champ

Résolu
chris -  
 chris -
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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  2. chris
     
    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
  3. chris
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  6. chris
     
    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
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    [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
  8. chris
     
    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
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  10. chris
     
    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
  11. chris
     
    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
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Faut coller ton texte entre les balises "<code>TON TEXTE ICI</code>"
    0
  13. chris
     
    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
  14. chris
     
    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
  15. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  16. chris
     
    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
  17. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  18. chris
     
    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