Remplacement uniquement entre 2 lignes

Fermé
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 - 18 nov. 2008 à 19:40
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 20 nov. 2008 à 11:24
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 :
$ 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:

10 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
18 nov. 2008 à 20:11
Salut,
sed '\#<Directory /var/www/>#,\#</Directory>#{/allowoverride none/I s/none/all/I}'
;-))
1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
18 nov. 2008 à 20:12
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
19 nov. 2008 à 07:22
Essaye ça alors :
sed '\#<D.* /var/www/>#,\#</Direct.*>#{
\#<D.* /var/www/># {
h
s#<.*>##
x
}
/AllowOverride/{
H
x
s/\n//
s/none/all/I
}
}'
;-))
1
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
18 nov. 2008 à 22:21
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
18 nov. 2008 à 22:48
sed '\#<Directory /var/www/>#,\#</Directory>#{/allowoverride none/I s/none/all/I;s/.*allowoverride.*/\t&/I}'
0
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
18 nov. 2008 à 23:07
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/>).

0
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
20 nov. 2008 à 01:08
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

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
20 nov. 2008 à 07:46
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}'
;-))
0
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
20 nov. 2008 à 09:36
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.

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
20 nov. 2008 à 11:06
-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

}'
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
20 nov. 2008 à 11:24
Salut,

C'est quoi ton truc : hiragana, katakana ou kanji ?! ;-DDD
0