Remplacement uniquement entre 2 lignes
santiago69
Messages postés
485
Statut
Membre
-
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Salut a tous,
Je voudrais remplacer AllowOverride None par AllowOverride All dans le fichier /etc/apache2/sites-available/default mais uniquement entre les balises <Directory /var/www/> et </directory>.
La commande suivante remplace toutes les occurence :
Comment faire pour limiter le remplacement a un intervale de lignes ?
Merci d'avance
Santiago
--
Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.
Je voudrais remplacer AllowOverride None par AllowOverride All dans le fichier /etc/apache2/sites-available/default mais uniquement entre les balises <Directory /var/www/> et </directory>.
La commande suivante remplace toutes les occurence :
$ sudo sed -i '/allowoverride none/I s/none/all/I' /etc/apache2/sites-available/default
Comment faire pour limiter le remplacement a un intervale de lignes ?
Merci d'avance
Santiago
--
Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.
10 réponses
-
Salut,
sed '\#<Directory /var/www/>#,\#</Directory>#{/allowoverride none/I s/none/all/I}';-))
-
-
Essaye ça alors :
sed '\#<D.* /var/www/>#,\#</Direct.*>#{ \#<D.* /var/www/># { h s#<.*>## x } /AllowOverride/{ H x s/\n// s/none/all/I } }';-))
-
Merci jipicy et lami20j,
La syntaxe proposee fonctionne parfaitement. Ce que je demande maintenant n'est que pure fioriture mais j'aimerais bien le solutionner, juste a titre d'exemple :
Supposons que je veuille en plus aligner AllowOverride une tabulation plus loin que <Directory /var/www/>. Un truc du genre :<Directory /var/www/> AllowOverride All
Pour cela j'ai essaye d'utiliser les references arriere, mais j'obtiens une erreur :sed '\#\([[:space:]]*\)<Directory /var/www/>#I,\#</Directory>#I <----- 1 ------> {s/^[[:space:]#]*AllowOverride None/\1\tAllowOverride All/I}' <---- 2 -----> <-------- 3 -------->
1 Je recupere dans une reference tous les espaces qui precedent la balise
2 Je remplace tout les espace et les # qui precedent la directive...
3 ... par les espace en \1 suivi d'une tabulation et de la directive
Voila la commande en un seul morceau. Je ne vois pas pourquoi elle genere une erreur. Pourriez vous la tester et m'aiguiller ?$ sed '\#\([[:space:]]*\)<Directory /var/www/>#I,\#</Directory>#I {s/^[[:space:]#]*AllowOverride None/\1\tAllowOverride All/I}' /etc/apache2/sites-available/default sed: -e expression #1, char 118: invalid reference \1 on `s' command's RHS
Merci d'avance
Santiago
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
sed '\#<Directory /var/www/>#,\#</Directory>#{/allowoverride none/I s/none/all/I;s/.*allowoverride.*/\t&/I}' -
merci jipicy,
en fait ton truc marche pas puisqu'il ne fait que decaler la ligne sans se soucier de l'aligner avec la precedente (<Directory /var/www/>).
-
WAHHHO, super !
J'ai du me plonger a fond dans la comprehension des fonctions de sed, mais je crois que j'ai compris. J'ai d'ailleurs du faire la petite modif suivante pour que ca marche (ligne 8) :sed '\#<Directory /var/www/>#,\#</Directory># { \#<Directory /var/www/># { h s#<.*>## x } /AllowOverride/ { s/^[[:space:]#]*/\t/ H x s/\n// s/none/all/I } }'
Pendant qu'on y est, j'ai un autre probleme avec sed... Ou peut etre devrais je faire un nouveau post.
Soit le fichier suivant :$ cat exemple Titre: Exemple Description: Cette desciption est tres longue, c'est pourquoi elle occupe plusieurs lignes. Date: 19 nov 2008 Version: 1.0.1
Je voudrais extraire la partie Description avec un script du genre :$ scriptdereve exemple Cette desciption est tres longue, c'est pourquoi elle occupe plusieurs lignes.
Je veux donc afficher tout ce qui se trouve entre "Description:" et "la premiere ligne ne commencant pas par un espace". J'ai essaye le script suivant qui marche presque :$ sed '/^Description:/,/^[^[:space:]]/!d' exemple Description: Cette desciption est tres longue, c'est pourquoi elle occupe plusieurs lignes. Date: 19 nov 2008
En m'aidant d'un exemple du tutoriel, j'ai essaye de le corriger ainsi, mais ca ne marche pas mieux :$ sed '/^Description:/,/^[^ ]/{ /^Description:/b;/^[^ ]/b; !d }' exemple Titre: Exemple Description: Cette desciption est tres longue, c'est pourquoi elle occupe plusieurs lignes. Date: 19 nov 2008 Version: 1.0.1
Avez vous un indice ?
Merci d'avance
Santiago
-
Re-
Essaye ça (j'ai supposé que le block pouvait être redondant dans le fichier...) :sed -n '/Description/{h;:z;n;/^ /{H;bz};x;p;b}';-)) -
Ayayay !
Encore un truc que je vais devoir decortiquer ! J'ai l'impression d'etre champolion.
Mais tant mieux, je n'apprend jamais autant que par l'exemple.
J'etudie le truc et je reviens vers toi s'il y a des points obscures.
-
-n Affichage sur demande uniquement /Description/{ Si on rencontre le motif h On place la ligne dans la mémoire annexe :z Etiquette de boucle n On passe à la ligne suivante /^ /{ Si la ligne correspond au motif (ligne commençant par un espace) H On l'ajoute à la mémoire annexe (dans le cas contraire on continue le script après l'accolade) bz On se branche à l'étiquette (boucle) } x Si un motif (espace en début de ligne) n'a pas été trouvé on échange le contenu de l'espace de travail avec le contenu de la mémoire annexe p On l'affiche b On se branche à la fin du script, ce qui a pour effet de charger une nouvelle ligne et de recommencer le traitement au début du script }'
-
-
Salut,
C'est quoi ton truc : hiragana, katakana ou kanji ?! ;-DDD