Bonjour,
Je voudrai savoir comment je pourrai ajouter un commentaire au début d'une ligne dans un fichier avec la commande sed. En faite c'est une ligne qui n'est pas commenté, mais je voudrai la commentée en passant par un script.
Par exemple:
CustomLog
en
# CustomLog
Merci pour votre aide
Moulinux
# avec awk
Posté par palm123 (site web personnel) . Évalué à 4.
CustomLog
# awk '/CustomLog/ { print "#"$0} ' a>c
# more c
#CustomLog
#
$0 représente la ligne complète, tu as dans le fichier appelé c le caractère # en plus du contenu du fichier a.
ウィズコロナ
[^] # et avec sed
Posté par Octabrain . Évalué à 6.
sed -i '/CustomLog/ s/^/# /' TonFichier
Attention, le "-i" marche avec certains BSD sed ainsi que le GNU sed, mais ce n'est pas POSIX.
[^] # Re: et avec sed
Posté par mekare . Évalué à -2.
sed -e '1,1s/^/#\ /g' TonFichier
[^] # Re: et avec sed
Posté par Octabrain . Évalué à 2.
[^] # Re: et avec sed
Posté par mekare . Évalué à 0.
Effectivement la commande que j'ai donné ne commente que la première ligne et quel qu'en soit le contenu... Promis la prochaine fois je relirais l'énoncé.
# cat ?
Posté par NeoX . Évalué à -2.
cat ancienfichier >>nouveaufichier
mv nouveaufichier ancienfichier
[^] # Re: cat ?
Posté par NeoX . Évalué à 2.
je sors
==[ ]
# sed recherche/remplace
Posté par NeoX . Évalué à 2.
nous donne
-i pour effectuer la manipulation sur le meme fichier que le fichier source
-e pour executer une commande
s/motifA/motifB/ pour chercher A et le remplacer par B
\( pour utiliser le symbole (
\1 pour reprendre la chaine qui se trouve dans les premieres ()
ce qui donne au finale
sed -i -e 's/\(Custom Log\)/# \1' tonfichier
[^] # Re: sed recherche/remplace
Posté par zecrazytux (site web personnel) . Évalué à 2.
- il manque le / final (s/truc/prout/)
- utiliser du backreference ici c'est pas super utile, un peu "over-engineeré", non ?
l'utilisation des backreferences peut aussi se faire sans nécessiter d'échappement des parenthèses avec l'option -r (regex étendues) ou -E sur BSD sed.
[^] # Re: sed recherche/remplace
Posté par NeoX . Évalué à 2.
le / final, ah oui, mauvais copier/coller/ :D
le backreference est ici mis pour l'exemple en rapport avec les options citées au dessus
qui permettent un usage plus complexe par la suite
[^] # Re: sed recherche/remplace
Posté par nodens . Évalué à 3.
# moncul CustomLog
Ca donnera
# moncul #CustomLog
(pas trop grave)
et sur la ligne
<Directory "/var/www/CustomLog">
Ca va donner :
<Directory "/var/www/#CustomLog">
Ce qui devient gênant... (oui j'ai mis CustomLog et pas Custom Log pour respecter l'énoncé, mais ça marche aussi avec l'espace).
Il faut préciser que le contenu de la backréférence matche depuis le début de la ligne.
D'ailleurs, ce qui l'intéresse vraiment ici, je suppose que c'est les directives CustomLog dans la configuration apache.
Donc les lignes contenant <un espace 0 ou n fois>CustomLog<un espace un nombre quelconque de fois> et on se fiche de ce qui suit (on veut juste modifier le début).
En expression rationnelle (étendue), ça se traduit de la manière suivante :
^:space:*CustomLog:space:+
Ce qui nous donne :
sed -rie 's/^:space:*CustomLog:space:+/#\&/i'
-r permet d'utiliser les regex étendues (surtout parce que je n'ai pas l'habitude d'utiliser les simples, je ne sais jamais quoi échapper). -i de modifier les fichiers en place (non POSIX comme dit plus haut, mais sur les distribs linux et les *BSD ça devrait passer).
On utilise la backreference spéciale \& qui prend tout ce qui matche la regex, mais \1 peut faire l'affaire à condition de mettre les () qui vont bien autour de ce qui nous intéresse.
Bon quand on veut faire joujou avec sed (ou awk, ou grep, ou tout un tas d'autres), il vaut mieux apprendre à se servir des expressions rationnelles. C'est jamais perdu, surtout si on fait aussi de la conf Apache httpd ;-)
Sans aller jusqu'à se procurer Mastering Regular Expressions chez O'reilly, il existe de bons tutoriels en lignes, et man grep contient une bonne introduction (sans les backreferences, malheureusement).
Avec cette expression, on garde les espaces et tabulations qui sont au début de la ligne, ça évite de péter l'indentation.
Enfin, avec le /i final on ignore la casse
[^] # Re: sed recherche/remplace
Posté par nodens . Évalué à 3.
Donc la première regex se lit :
^[[:space:]]*CustomLog:[[space:]]+
et la ligne de commande sed :
sed -rie 's/^[[:space:]]*CustomLog[[:space:]]+/#\&/i' /chemin/vers/mon/fichier
[^] # Re: sed recherche/remplace
Posté par NeoX . Évalué à 3.
j'utilise un petit outil de faineant
txt2regex : dispo dans toute les bonnes cremeries ;)
[^] # Re: sed recherche/remplace
Posté par nodens . Évalué à 2.
Mais la ligne de commande devrait être correcte :-)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.