Remplacer une ligne dans un fichier avec SED

Résolu
Wilfou Messages postés 108 Statut Membre -  
Wilfou Messages postés 108 Statut Membre -
Bonjour,

En parcourant le web, j'ai trouver qu'on pouvait modifier le contenu d'un fichier à l'aide de SED.

Dans mon cas, j'aimerais d'abord rechercher une ligne spécifique à l'aide du début de la ligne ("$variable_origine=" par exemple) et la remplacer par une autre ligne ("$variable_remplace=contenu").

Pouvez-vous m'aider à créer cette ligne que je pourrais ajouter dans mon petit script ? je m'y retrouve plus avec les ^, les \, les /, etc. (une explication ou même un lien vers un tuto que vous trouvez assez simple à comprendre me convient =D)

Merci

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
     
    $ cat plop 
    blablabla
    blablabla
    $une_variable=un_contenu
    blablabla
    blablabla
    
    $ sed -i.bak 's/^\$une_variable=.*/\$une_autre_variable=un_autre_contenu/' plop
    
    $ cat plop 
    blablabla
    blablabla
    $une_autre_variable=un_autre_contenu
    blablabla
    blablabla

    3
  2. Wilfou Messages postés 108 Statut Membre 10
     
    C'est si simple ?

    donc si j'ai bien compris :

    le s c'est substitution
    le \ c'est pour pouvoir mettre un caractère spécial dans l'expression
    le / c'est le délimiteur à l'intérieur de l'expression
    le ' c'est le délimiteur de l'expression

    maintenant à quoi servent le ^ et le .*

    Merci de ton aide en tout cas, je vais essayé ça ce soir ^^
    2
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
       
      le s c'est substitution
      le \ c'est pour pouvoir mettre un caractère spécial dans l'expression
      le / c'est le délimiteur à l'intérieur de l'expression
      le ' c'est le délimiteur de l'expression


      Exact pour tout.

      maintenant à quoi servent le ^ et le .*

      Le " ^" correspond à une chaîne nulle en début de ligne, autrement dit ce qui se trouve après l'accent circonflexe doit apparaître en début de ligne.

      Le "." désigne n'importe quel caractère et le "*" correspond à une séquence de zéro, une ou plusieurs occurrence(s) de l'expression précédente (ou caractère). Dans ton cas ça englobe tout ce qui suit le signe égal dans "$une_variable=un_contenu".

      Pour plus de renseignements sur sed voir dans la FAQ :
      https://www.commentcamarche.net/faq/sed-478
      et notamment :
      https://forums.commentcamarche.net/forum/affich-37620084-sed-introduction-a-sed-part-i
      https://forums.commentcamarche.net/forum/affich-37620020-sed-introduction-a-sed-part-ii
      https://forums.commentcamarche.net/forum/affich-37620122-sed-introduction-a-sed-part-iii
      0
    2. Wilfou Messages postés 108 Statut Membre 10
       
      et bien merci beaucoup ! =)
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
     
    Salut,

    Poste un exemple concret AVANT => APRÈS de ce que tu veux exactement.
    1
  4. Wilfou Messages postés 108 Statut Membre 10
     
    Alors il y a le fichier que je veux éditer : conf.php
    blablabla
    blablabla
    $une_variable=un_contenu
    blablabla
    blablabla
    

    Et il y a mon petit script : script.sh

    Mon petit script.sh, quand je l'exécute, doit remplacer la ligne avec la variable qui est dans conf.php.

    Dans ma petite tête, voila comment je me le représente :

    1. j'exécute le script.sh
    2. il rentre dans le fichier conf.php
    3. le script parcours conf.php jusqu'à trouver la ligne avec la variable uniquement à l'aide de "$une_variable=" (car le contenu de la variable peut être tout et n'importe quoi)
    4. le script remplace la ligne qu'il a trouvé par la ligne suivante : "$une_autre_variable=un_autre_contenu"
    5. le script sort du fichier

    Donc après cette exécution, voila le fichier conf.php final :
    blablabla
    blablabla
    $une_autre_variable=un_autre_contenu
    blablabla
    blablabla
    


    Voila ^^
    1