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.confet 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.htaccessfichiers.Par exemple :dans le code ci-dessous de
httpd.conffichier, 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é !