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 :
- <Directory "/var/www/le-site-a-toto.com/html">
- Options FollowSymLinks
- AllowOverride All
- Order allow,deny
- Allow from all
- </Directory>
- pour passer les vhosts en PHP FPM on souhaite ajouter les lignes suivantes après le
</Directory>
:- <FilesMatch \.php$>
- # SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
- SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
- # SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
- </FilesMatch>
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 :
- 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 :
- for i in `ls *.conf`; do sed -i -e '/<\/Directory>/ r fic.txt' $i; done
Références :
- mémo rapide de toutes les astuces d’écritures de sed : https://www.commentcamarche.net/faq/6699-sed-trucs-et-astuces
- utilisation d’un fichier comme chaîne remplaçante : https://stackoverflow.com/a/26773903
- le fonctionnement détaillé de sed et en particulier de toutes les commandes : https://www.commentcamarche.net/faq/9536-sed-introduction-a-sed-part-i
Mémo : la commande pour 2 remplacements différents en fonction du nombre de tabulations (\t) avant le Directory :
- 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 :-)