Ajout de texte formaté avec sed

But de la commande : utiliser sed pour ajouter un contenu textuel à un point précis d’un fichier (déterminé par un motif de regexp)

, par clem

La commande sed permet de prendre le contenu d’un fichier et de l’insérer dans un autre avec la commande r : exemple détaillé

Situation de départ

  • tous les fichiers de vhost (situés dans /etc/apache2/sites-available) d’un serveur apache ont en commun d’avoir au moins une directive Directory de la forme :
    1.         <Directory "/var/www/le-site-a-toto.com/html">
    2.                 Options FollowSymLinks
    3.                 AllowOverride All
    4.                 Order allow,deny
    5.                 Allow from all
    6.         </Directory>

    Télécharger

  • pour passer les vhosts en PHP FPM on souhaite ajouter les lignes suivantes après le </Directory> :
    1.     <FilesMatch \.php$>
    2.     #    SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    3.         SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
    4.     #    SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    5.     </FilesMatch>

    Télécharger

Commande de base

  • puisque le contenu à insérer doit conserver le formatage, il n’est pas possible d’utiliser un "simple"
    sed 's/à remplacer/le remplacement/g'
    on va donc créer un fichier fic.txt qui contiendra le contenu de remplacement.
  • la commande sed pour modifier le fichier 100_le-site-a-toto.com.conf sera donc :
    1. sed -i -e '/<\/Directory>/ r fic.txt' 100_le-site-a-toto.com.conf

    Détail :

    • -i : option pour modifier le fichier directement
    • /<\/Directory>/ : l’expression régulière qui est recherchée pour déterminer où doit se faire l’insertion du contenu supplémentaire
    • r fic.txt : commande pour l’insertion du contenu du fichier lorsque le motif de l’expression régulière est trouvé

Traiter l’ensemble des fichiers du dossier

Une boucle for/do/done va permettre de traiter tous les fichiers du dossier :

  1. for i in `ls *.conf`; do sed -i -e '/<\/Directory>/ r fic.txt' $i; done

Références :

Mémo : la commande pour 2 remplacements différents en fonction du nombre de tabulations (\t) avant le Directory :

  1. for i in `ls *.conf`;do sed -i -e '/^\t<\/Directory>/ r fic.txt' -e  '/^\t\t<\/Directory>/ r fic2.txt' $i;done

...et hop ! 100 vhost modifiés en une petite commande :-)