• [^] # Re: sed recherche/remplace

    Posté par . En réponse au message Ajouter un commentaire au debut d'une ligne dans un fichier avec sed. É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