Voici une question de notre lecteur régulier M. Rajan. Il veut utiliser Sed
pour rechercher et remplacer une ligne entre des plages de motifs. Eh bien, voici une question de sa part.
J'ai écrit un script shell pour automatiser quelques tâches sur VPS. Par exemple, je voulais modifier
httpd.conf
et remplacez"AllowOverride None" to "AllowOverride All"
qui se trouve dans un<Directory "/var/www/html">
particulier . L'idée est de remplacer uniquement la ligne dans ce blocparticulier sans affecter les autres blocs (en fait, il y en a beaucoup, mais je suis préoccupé par le bloc qui contient "/var/www/html"
). La raison pour laquelle je voulais faire cela est que j'ai eu des difficultés à configurer Apache pour autoriser les remplacements de.htaccess
fichiers.Par exemple :dans le code ci-dessous de
httpd.conf
fichier, je dois rechercher le modèle<Directory "/var/www/html">
et remplacez AllowOverride None avec Autoriser tout remplacer situé dans cette structure de répertoires sans affecter les autres structures de répertoires.<Directory "/var/www/html"> AllowOverride None </Directory>S'il vous plaît, aidez-moi.
Utilisation de Sed pour rechercher et remplacer une ligne entre des plages de motifs
Cela semble être une tâche pour sed
, comme sed
prend en charge les plages de modèles sous cette forme :
sed '/startpattern/,/endpattern/ <sed-commands>' file
Donc, selon les exigences de Rajan, nous devons rechercher le modèle de départ <Directory "/var/www/html">
, modèle de fin </Directory>
et recherchez "AllowOverride None" and replace it with "AllowOverride all"
. Pour ce faire, le sed
La commande doit être utilisée comme indiqué ci-dessous.
#sed -i '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride None/AllowOverride all/' httpd.conf
Ici -i
L'option consiste à modifier les fichiers sur place. Si vous n'utilisez pas l'option -i
, alors la sortie modifiée sera imprimée sur le stdout
et le fichier ne serait pas modifié !