Utilisation de sed pour mettre en commentaire

Utilisation de sed pour mettre en commentaire - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 19-04-2008 à 20:27:11    

Bonjour à tous
 
Voila je travaille sur un script qui permettrait de commenter/décommenter les lignes d'un fichier de configuration (par exemple, le fichier de configuration de proftpd).
J'aimerais utiliser la commande sed pour cela, seulement voilà, mon probleme est que je trouve cette commande tres tres complexe :(
 
Voici la situation, j'ai par exemple à la fin de mon fichier de conf les lignes suivantes :
 

Code :
  1. ...
  2. <Anonymous /home/anonymous_ftp/uploads>
  3.     User ftp
  4.     Group nogroup
  5.     UserAlias anonymous ftp
  6.     MaxClients 10
  7.     RequireValidShell off
  8.     AnonRequirePassword off
  9. </Anonymous>


 
J'aimerais donc les commenter en ajoutant un # en début de chaque ligne de bloc... Comment pourrais-je m'y prendre ??
 
Je vous en remercie d'avance :)

Reply

Marsh Posté le 19-04-2008 à 20:27:11   

Reply

Marsh Posté le 20-04-2008 à 16:22:45    

En effet tu choisis pas l'outil le plus simple :D
 
Soit le fichier de config suivant :

<blabla>
 truc
</blabla>
 
<Anonymous /home/anonymous_ftp/uploads>
    User ftp
    Group nogroup
    UserAlias anonymous ftp
    MaxClients 10
    RequireValidShell off
    AnonRequirePassword off
</Anonymous>
 
<blibli>
 houba
</blibli>


 
 
 
Je veux, pour toutes les lignes allant de :  

<Anonymous /home/anonymous_ftp/uploads>


à  

</Anonymous>


remplacer ces dites lignes par "la même chose précédée d'un #"
 
 
 
 
1. Pour détecter la première ligne, on va chercher "<Anonymous" (libre à toi d'être plus précis), dans sed ca se dit :

/<Anonymous/


Bref ca s'écrit en mettant le motif de recherche entre deux "/"
 
 
 
 
2. Pour la dernière ligne de la partie qui nous intéresse, on va chercher "</Anonymous", dans sed ca se dit :

/<\/Anonymous/


Ici je suis obligé de protéger le / de "</Anonymous" sinon sed croira que le motif de recherche se termine là. Donc je le protège (et pour protéger un caractère c on écrit \c, donc ici ca fait un joli \/)
 
 
 
 
Sur toutes les lignes entre 1. et 2., je veux remplacer "la ligne" par "#la ligne", donc je fais en sed :

s/^/#/


Ce qui se lit s (substitue) / truc qu'on cherche / truc qu'on veut mettre à la place /
Ici :  s / ^ (marqueur invisible de début de ligne) / # (ben le caractère #) /
 
 
 
 
D'où la commande finale :

sed  '/<Anonymous/ , /<\/Anonymous/ s/^/#/'  mon_fichier


Qui produit :  


<blabla>
 truc
</blabla>
 
#<Anonymous /home/anonymous_ftp/uploads>
#    User ftp
#    Group nogroup
#    UserAlias anonymous ftp
#    MaxClients 10
#    RequireValidShell off
#    AnonRequirePassword off
#</Anonymous>
 
<blibli>
 houba
</blibli>
 
 


 
 
Problème : ca va s'appliquer de la PREMIERE ligne contenant "<Anonymous" à la DERNIERE ligne contenant "</Anonymous". Donc si ton fichier a plusieurs blocs de ce genre, il faudra être plus fin.  
Comment ? C'est pas dur d'augmenter la précision sur la 1ere ligne car on a un /home/truc/bidule sans doute unique, mais sur la dernière c'est plus dur car a priori tous les </Anonymous>.
Bilan : c'est possible mais pas évident sous sed.
 
 
 :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 21-04-2008 à 08:20:13    

Dans l'exemple de Xavier_OM, on voit que le bloc à commenter est entre la ligne 5 et 12. Étant donné que les évolutions d'un fichier de conf sont censées être maîtrisés par l'administrateur, on peut se permettre de se servir du numéro de ligne comme référence:

 

sed -e ' 5,12 s/^/#/g' fichier.txt

 


<blabla>
 truc
</blabla>
 
#<Anonymous /home/anonymous_ftp/uploads>
#    User ftp
#    Group nogroup
#    UserAlias anonymous ftp
#    MaxClients 10
#    RequireValidShell off
#    AnonRequirePassword off
#</Anonymous>
 
<blibli>
 houba
</blibli>


Message édité par chaica le 21-04-2008 à 08:22:49
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed