Sed ajout d'un caractère en fin de ligne [Résolu/Fermé]

Signaler
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
-
Messages postés
198
Date d'inscription
jeudi 2 août 2012
Statut
Membre
Dernière intervention
21 mars 2019
-
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

9 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753
-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 (&)

;-))
9
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57505 internautes nous ont dit merci ce mois-ci

Messages postés
198
Date d'inscription
jeudi 2 août 2012
Statut
Membre
Dernière intervention
21 mars 2019
120
Merci, juste ce qu'il me fallait.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753
Re-
sed -e '/^[ ]*#\|#\|^$/! s/.*/&A/' -e '/^[ ]*#/! s/[  ]*#/A&/' fichier
;-))
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
encore merci

serait'il possible que tu me décortique cette commande que je puisse la comprendre stp
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
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?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753
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".
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
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
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
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?
Messages postés
73
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
19 décembre 2007
2
s/[ ]*\t*#/;\t\t&/ fonctionne
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019

Dans ce cas précis $ch=deux !
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753 > abou
Avec ou sans le point d'exclamation ?

Et dans "test.txt" il y a quoi (si ce n'est pas indiscret) ?
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019

Sans le ! bien sûr !

Quand à test.txt c'est comme son nom l'indique un fichier test dont voici le contenu :

un
deux
trois
cent-deux
vingt-deux
cinq
six deux
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019

C'est guère mieux avec les doubles quotes :

sed -i "/$ch/ s/.*/#&/" $HOME/test.txt
sed: 1: "/Users/aa/test.txt": command a expects \ followed by text

sed -i "/$ch/ s/.*/#&/" test.txt
sed: 1: "test.txt": undefined label 'est.txt'
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019

Je suis sous Leopard (Mac OS X 10.5.5) et j'ai ceci :

aa$ sed -i '/'"$ch"'/ s/.*/#&/' test.txt
sed: 1: "test.txt": undefined label 'est.txt'

et quand je donne le chemin complet :

sed -i '/'"$ch"'/ s/.*/#&/' $HOME/test.txt
sed: 1: "/Users/aa/test.txt": command a expects \ followed by text

?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753
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]$
;-\
Sachant que la chaîne à chercher est passer en varaible ;-)
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753 > abou
[tmpfs]$ cat test.txt
deux
trois
#cent-deux
vingt-Deux
cinq
#six deUx
trente-DEux
deuX

[tmpfs]$ sed "/$ch/I{/^#/! s/^/#/I}" test.txt
#deux
trois
#cent-deux
#vingt-Deux
cinq
#six deUx
#trente-DEux
#deuX

[tmpfs]$
;-))
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019

Mac-mini:~ aa$ cat test.txt
deux
trois
#cent-deux
vingt-Deux
cinq
#six deUx
trente-DEux
deuX
Mac-mini:~ aa$ ch=deux
Mac-mini:~ aa$ sed "/$ch/I{/^#/! s/^/#/I}" test.txt
sed: 1: "/deux/I{/^#/! s/^/#/I}": invalid command code I

:(
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019

J'avais pas testé avant, mais il semble que chez moi la commande :

sed "/$ch/{/^#/! s/^/#/}" test.txt

pose problème :

sed: 1: "/deux/{/^#/! s/^/#/}": bad flag in substitute command: '}'

Donc du coup avec le "I", c'est encore pire :(

Une idée ?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 753 > abou
Quelle version de sed ? (sed --version)
Quel système ?
Je ne peux faire un sed --version ;-)
Ça doit être du BSD vu que je suis sous Leopard (Mac OS X).