Sed ajout d'un caractère en fin de ligne

Résolu/Fermé
vieurou Messages postés 73 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 19 décembre 2007 - Modifié le 14 sept. 2007 à 15:21
Lordanonymous Messages postés 198 Date d'inscription jeudi 2 août 2012 Statut Membre Dernière intervention 21 mars 2019 - 12 sept. 2013 à 23:53
bonjour,

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
A voir également:

9 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 895
14 sept. 2007 à 11:31
-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 (&)

;-))
10
Lordanonymous Messages postés 198 Date d'inscription jeudi 2 août 2012 Statut Membre Dernière intervention 21 mars 2019 142
12 sept. 2013 à 23:53
Merci, juste ce qu'il me fallait.
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 895
14 sept. 2007 à 10:52
Re-
sed -e '/^[ ]*#\|#\|^$/! s/.*/&A/' -e '/^[ ]*#/! s/[  ]*#/A&/' fichier
;-))
2
vieurou Messages postés 73 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 19 décembre 2007 2
14 sept. 2007 à 11:09
encore merci

serait'il possible que tu me décortique cette commande que je puisse la comprendre stp
1
vieurou Messages postés 73 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 19 décembre 2007 2
14 sept. 2007 à 14:32
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?
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 895
14 sept. 2007 à 14:47
Oui c'est effectivement la cause, je viens de tester.

La solution est dans la conversion au format Unix, soit avec un utilitaire comme "dos2unix" soit avec la méthode donnée plus haut avec "sed".
0

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

Posez votre question
vieurou Messages postés 73 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 19 décembre 2007 2
14 sept. 2007 à 14:43
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
0
vieurou Messages postés 73 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 19 décembre 2007 2
14 sept. 2007 à 14:52
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?
0
vieurou Messages postés 73 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 19 décembre 2007 2
14 sept. 2007 à 15:21
s/[ ]*\t*#/;\t\t&/ fonctionne
0
Et si on veut juste commenter par un # une ligne contenant une chaîne donnée ?

Merci d'avance.
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 895 > abou
7 oct. 2008 à 15:51
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$
;-))
0
abou > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
7 oct. 2008 à 22:17
OK ça marche pour une chaîne constante. Qu'en est-il des chaînes variables ? Merci
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 895 > abou
7 oct. 2008 à 22:19
Qu'entends-tu par variable ???

Des exemples ?
0
abou > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
7 oct. 2008 à 22:27
OK ça marche pour une chaîne constante. Qu'en est-il des chaînes variables ? Merci

J'ai trouvé : il suffit d'utiliser les doubles quotes !

sed "/$ch/ s/.*/#&/" test.txt
au lieu de
sed '/$ch/ s/.*/#&/' test.txt
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 895
7 oct. 2008 à 23:02
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]$
;-\
0
Oui la command sed tout court fonctionne bien en sortie standard. Mon souci c'est de faire l'insertion avec sed -i sans redirection si possible.
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 895 > abou
7 oct. 2008 à 23:05
Ça marche pareil :
[tmpfs]$ cat test.txt
un
deux
trois
cent-deux
vingt-deux
cinq
six deux

[tmpfs]$ sed -i.bak '/'"$ch"'/ s/.*/#&/' test.txt

[tmpfs]$ cat test.txt
un
#deux
trois
#cent-deux
#vingt-deux
cinq
#six deux

[tmpfs]$
;-\
0
Tu m'apprends des choses : tout était dans le .bak !
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 895 > abou
7 oct. 2008 à 23:15
Ben en fait ça crée une sauvegarde. Tu mets ce que tu veux après le "i"...

Et tant qu'on y est, il y a plus simple pour rajouter un # en début de ligne :
sed '/deux/ s/^/#/' test.txt
;-))
0
abou > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
7 oct. 2008 à 23:52
Fantastique sauf qu'avec une variable il me faut absolument les doubles quotes.
Et pour le fun : à quoi bon commenter une ligne qui l'est déjà ?
Ce qui donnerait avec des regex (un début, une négation)… je suis fatigué et toi ?
0
Je ne peux faire un sed --version ;-)
Ça doit être du BSD vu que je suis sous Leopard (Mac OS X).
0