Sed ajout d'un caractère en fin de ligne
RésoluLordanonymous Messages postés 229 Statut Membre -
Je voudrais avec sed pouvoir ajouter un caractère en fin de ligne, mais uniquement si cette ligne ne commence pas par un #, ni par espace #, ni par tabulation #.
Sur les lignes traitées, je voudrais rajouter un caractère en fin de ligne, mais si cette ligne contient un #, je voudrais que ce caractère soit placé non plus en fin de ligne mais avant le dièse.
Par exemple , je voudrais que le fichier contenant le texte :
#code commenté
#code commenté
code non commenté
code non commenté #commentaire
devienne :
#code commenté
#code commenté
code non commenté(un caractère en plus ici)
code non commenté(un caractère en plus ici) #commentaire
merci de votre aide
9 réponses
La problématique liée à sed consiste à ajouter un caractère en fin de ligne uniquement sur les segments qui ne commencent ni par un dièse, ni par un espace, ni par une tabulation. Pour les lignes contenant un dièse, le caractère doit être inséré avant le dièse plutôt qu'en fin de ligne, avec des exemples montrant le texte et le résultat attendu. Plusieurs propositions utilisent des expressions régulières et des dérivations sed, avec des motifs excluant les lignes non pertinentes et des substitutions en fin de ligne, notamment s/.*/&A/ ou s/[ ]*#/A&/. En outre, des aspects pratiques liés au format de fichier (DOS/Unix) et à l'usage de caractères spéciaux comme \t influent sur le comportement des commandes et nécessitent des ajustements.
-
-e
Permet d'enchainer plusieurs commandes
/^[ ]*#\|#\|^$/!
Recherche toutes les lignes ne commençants pas "^" par un dièse, précédé ou non d'un espace "[ ]*", ou "\|" (on protège le "pipe" par un antislash pour qu'il ne soit pas interprété littéralement) contenant un dièse, ou "\|^$" les lignes vides. Le point d'exclamation final permettant d'exprimer la négation
s/.*/&A/'
On substitue alors toute la ligne ".*" par elle même "&" suivie d'un "A"
-e '/^[ ]*#/!
Nouvelle commande, toutes lignes ne commençant pas par un dièse, précédé ou non d'un espace
s/[ ]*#/A&/'
Substituer le motif constituer d'un ou plusieurs espace(s) suivi(s) d'un dièse par un A et le motif lui même (&)
;-)) -
Re-
sed -e '/^[ ]*#\|#\|^$/! s/.*/&A/' -e '/^[ ]*#/! s/[ ]*#/A&/' fichier
;-))
-
encore merci
serait'il possible que tu me décortique cette commande que je puisse la comprendre stp -
je sais pas trop pourquoi mais sed -e '/^[ ]*#\|#\|^$/! s/.*/&;/' me fait un retour a la ligne avant de me mettre mon point virgule, ça doit etre parceque mon fichier et un fichier dos mais coment resoudre cela?
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
et dans s/[ ]*#/;&/' si je veut aussi qu'il me suprime les tabulation j'atoute \t\+ comme cela?
s/[ ]*\t\+#/;&/'
apres test, ça marche pas -
eh bien le souci c'est que la premiere commande de mon script est
sed -i -e 's/^M$//' $file
qui normalement me le met en format unix, nan? -
-
-
Salut,
jp@MDK:~/tmpfs ssh$ cat fichier Bonjour, Et si on veut juste commenter par un # une ligne contenant une chaîne donnée ? Merci d'avance. jp@MDK:~/tmpfs ssh$ sed '/commenter/ s/.*/#&/' fichier Bonjour, #Et si on veut juste commenter par un # une ligne contenant une chaîne donnée ? Merci d'avance. jp@MDK:~/tmpfs ssh$
;-))
-
-
-
-
-
Je comprends pas; chez moi ça marche bien :
[tmpfs]$ cat test.txt un deux trois cent-deux vingt-deux cinq six deux [tmpfs]$ ch=deux [tmpfs]$ echo "$ch" deux [tmpfs]$ sed "/$ch/ s/.*/#&/" test.txt un #deux trois #cent-deux #vingt-deux cinq #six deux [tmpfs]$ sed '/'"$ch"'/ s/.*/#&/' test.txt un #deux trois #cent-deux #vingt-deux cinq #six deux [tmpfs]$
;-\
-
Je ne peux faire un sed --version ;-)
Ça doit être du BSD vu que je suis sous Leopard (Mac OS X).