Remplacement uniquement entre 2 lignes

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

--

Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.

10 réponses

  1. Modérateur
    Salut,
    sed '\#<Directory /var/www/>#,\#</Directory>#{/allowoverride none/I s/none/all/I}'
    ;-))
    1
    1. Modérateur
      Essaye ça alors :
      sed '\#<D.* /var/www/>#,\#</Direct.*>#{
      \#<D.* /var/www/># {
      h
      s#<.*>##
      x
      }
      /AllowOverride/{
      H
      x
      s/\n//
      s/none/all/I
      }
      }'
      ;-))
      1
      1. 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
        1. Modérateur
          sed '\#<Directory /var/www/>#,\#</Directory>#{/allowoverride none/I s/none/all/I;s/.*allowoverride.*/\t&/I}'
          0
          1. 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
            1. 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
              1. Modérateur
                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
                1. 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
                  1. Modérateur
                    -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
                2. Modérateur
                  Salut,

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