Forum Programmation.shell Ajouter un commentaire au debut d'une ligne dans un fichier avec sed

Posté par (page perso) .
Tags : aucun
2
7
déc.
2009
Bonjour,

Je voudrai savoir comment je pourrai ajouter un commentaire au début d'une ligne dans un fichier avec la commande sed. En faite c'est une ligne qui n'est pas commenté, mais je voudrai la commentée en passant par un script.

Par exemple:

CustomLog

en

# CustomLog

Merci pour votre aide

Moulinux
  • # avec awk

    Posté par (page perso) . Évalué à 4.

    # more a
    CustomLog
    # awk '/CustomLog/ { print "#"$0} ' a>c
    # more c
    #CustomLog
    #

    $0 représente la ligne complète, tu as dans le fichier appelé c le caractère # en plus du contenu du fichier a.

    If you choose open source because you don't have to pay, but depend on it anyway, you're part of the problem.evloper) February 17, 2014

    • [^] # et avec sed

      Posté par . Évalué à 6.

      sed -i '/CustomLog/ s/^/# /' TonFichier
      Attention, le "-i" marche avec certains BSD sed ainsi que le GNU sed, mais ce n'est pas POSIX.
      • [^] # Re: et avec sed

        Posté par . Évalué à -2.

        ou comme ça c'est encore plus mieux :
        sed -e '1,1s/^/#\ /g' TonFichier
        • [^] # Re: et avec sed

          Posté par . Évalué à 2.

          ? Il manque le -i, ça ne marche que sur la première ligne, et l'antislash est inutile.
          • [^] # Re: et avec sed

            Posté par . Évalué à 0.

            Pardon, j'avais mal lu l'énoncé.
            Effectivement la commande que j'ai donné ne commente que la première ligne et quel qu'en soit le contenu... Promis la prochaine fois je relirais l'énoncé.
  • # cat ?

    Posté par . Évalué à -2.

    echo # >nouveaufichier
    cat ancienfichier >>nouveaufichier
    mv nouveaufichier ancienfichier
    • [^] # Re: cat ?

      Posté par . Évalué à 2.

      j'avais lu en "debut de fichier" et pas en debut de ligne...
      je sors
      ==[ ]
  • # sed recherche/remplace

    Posté par . Évalué à 2.

    man sed

    nous donne
    -i pour effectuer la manipulation sur le meme fichier que le fichier source

    -e pour executer une commande

    s/motifA/motifB/ pour chercher A et le remplacer par B

    \( pour utiliser le symbole (

    \1 pour reprendre la chaine qui se trouve dans les premieres ()



    ce qui donne au finale
    sed -i -e 's/\(Custom Log\)/# \1' tonfichier
    • [^] # Re: sed recherche/remplace

      Posté par (page perso) . Évalué à 2.

      - useless use of -e: utile seulement lorsqu'il y a plusieurs commandes
      - il manque le / final (s/truc/prout/)
      - utiliser du backreference ici c'est pas super utile, un peu "over-engineeré", non ?

      l'utilisation des backreferences peut aussi se faire sans nécessiter d'échappement des parenthèses avec l'option -r (regex étendues) ou -E sur BSD sed.
      • [^] # Re: sed recherche/remplace

        Posté par . Évalué à 2.

        ok pour le -e qui n'est pas utile, mais j'ai pour habitude de le mettre pour ne pas l'oublier dans les cas complexe

        le / final, ah oui, mauvais copier/coller/ :D

        le backreference est ici mis pour l'exemple en rapport avec les options citées au dessus
        qui permettent un usage plus complexe par la suite
        • [^] # Re: sed recherche/remplace

          Posté par . Évalué à 3.

          alors sur la ligne suivante :
          # moncul CustomLog

          Ca donnera
          # moncul #CustomLog

          (pas trop grave)

          et sur la ligne

          <Directory "/var/www/CustomLog">

          Ca va donner :

          <Directory "/var/www/#CustomLog">

          Ce qui devient gênant... (oui j'ai mis CustomLog et pas Custom Log pour respecter l'énoncé, mais ça marche aussi avec l'espace).

          Il faut préciser que le contenu de la backréférence matche depuis le début de la ligne.

          D'ailleurs, ce qui l'intéresse vraiment ici, je suppose que c'est les directives CustomLog dans la configuration apache.
          Donc les lignes contenant <un espace 0 ou n fois>CustomLog<un espace un nombre quelconque de fois> et on se fiche de ce qui suit (on veut juste modifier le début).

          En expression rationnelle (étendue), ça se traduit de la manière suivante :

          ^:space:*CustomLog:space:+

          Ce qui nous donne :

          sed -rie 's/^:space:*CustomLog:space:+/#\&/i'

          -r permet d'utiliser les regex étendues (surtout parce que je n'ai pas l'habitude d'utiliser les simples, je ne sais jamais quoi échapper). -i de modifier les fichiers en place (non POSIX comme dit plus haut, mais sur les distribs linux et les *BSD ça devrait passer).

          On utilise la backreference spéciale \& qui prend tout ce qui matche la regex, mais \1 peut faire l'affaire à condition de mettre les () qui vont bien autour de ce qui nous intéresse.

          Bon quand on veut faire joujou avec sed (ou awk, ou grep, ou tout un tas d'autres), il vaut mieux apprendre à se servir des expressions rationnelles. C'est jamais perdu, surtout si on fait aussi de la conf Apache httpd ;-)


          Sans aller jusqu'à se procurer Mastering Regular Expressions chez O'reilly, il existe de bons tutoriels en lignes, et man grep contient une bonne introduction (sans les backreferences, malheureusement).

          Avec cette expression, on garde les espaces et tabulations qui sont au début de la ligne, ça évite de péter l'indentation.

          Enfin, avec le /i final on ignore la casse
          • [^] # Re: sed recherche/remplace

            Posté par . Évalué à 3.

            Templeet m'a mangé les <> et [] dans les regex malgré les balises <code></code>... Vilain !

            Donc la première regex se lit :

            ^[[:space:]]*CustomLog:[[space:]]+

            et la ligne de commande sed :

            sed -rie 's/^[[:space:]]*CustomLog[[:space:]]+/#\&/i' /chemin/vers/mon/fichier

            • [^] # Re: sed recherche/remplace

              Posté par . Évalué à 3.

              pour ceux qui comme moi se demande toujours comment ecrire la regexp
              j'utilise un petit outil de faineant

              txt2regex : dispo dans toute les bonnes cremeries ;)
            • [^] # Re: sed recherche/remplace

              Posté par . Évalué à 2.

              je suis décidément pas doué du clavier. J'ai écris :[[space:]] au lieu de [[:space:]].

              Mais la ligne de commande devrait être correcte :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.