Remplacement uniquement entre 2 lignes
santiago69
Messages postés
485
Statut
Membre
-
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
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
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
A voir également:
- Remplacement uniquement entre 2 lignes
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Supercopier 2 - Télécharger - Gestion de fichiers
- 2 ecran pc - Guide
- Faire 2 colonnes sur word - Guide
10 réponses
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 :
Pour cela j'ai essaye d'utiliser les references arriere, mais j'obtiens une erreur :
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 ?
Merci d'avance
Santiago
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 questionsed '\#<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/>).
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) :
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 :
Je voudrais extraire la partie Description avec un script du genre :
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 :
En m'aidant d'un exemple du tutoriel, j'ai essaye de le corriger ainsi, mais ca ne marche pas mieux :
Avez vous un indice ?
Merci d'avance
Santiago
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...) :
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.
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
}'