#1 Le 27/11/2021, à 20:21
- Sciensous
sed pour éliminer lignes multiples [RÉSOLU]
hello, j'ai trouvé sur le net une commande utilisant sed qui permettrait de supprimer 2 lignes consécutives d'un fichier:
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'or je teste avec un fichier test contenant :
zz
aa
bb
cc
aa
dd
eeet
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' testretourne le fichier sans supprimer le aa en double
Quelqu'un saurait le pourquoi du comment ?
merci![]()
Dernière modification par Sciensous (Le 28/11/2021, à 10:45)
antiX 19 (Debian Buster) et (L)Ubuntu focal 20.04
( sous LXDE et gnome-shell )
Hors ligne
#2 Le 28/11/2021, à 00:35
- nany

Re : sed pour éliminer lignes multiples [RÉSOLU]
Bonjour,
Si on exécute
sed --debug -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' teston voit que la commande /^\([ -~]*\n\).*\n\1/d ne donne rien. Voilà déjà le pourquoi. Quant au comment, je cherche encore car je n’arrive pas à comprendre cette commande (le d je vois bien mais c’est le pattern qui me trouble).
En revanche, en cherchant où tu avais bien pu trouver cette ligne sed, j’ai trouvé une commande awk qui marche du feu de dieu et qui m’a fait découvrir seen :
awk '!seen[$0]++' testHors ligne
#3 Le 28/11/2021, à 00:46
- nany

Re : sed pour éliminer lignes multiples [RÉSOLU]
je n’arrive pas à comprendre cette commande (le d je vois bien mais c’est le pattern qui me trouble).
Si on remplace [ -~] par un point ça fonctionne :
sed -n 'G; s/\n/&&/; /^\(.*\n\).*\n\1/d; s/\n//; h; P' testC’est donc bien cette partie ([ -~]) que je n’ai pas comprise qui est la fautive.
Hors ligne
#4 Le 28/11/2021, à 01:13
- nany

Re : sed pour éliminer lignes multiples [RÉSOLU]
cette partie ([ -~]) que je n’ai pas comprise
C’est tout simple en fait :
Ça cherche tout caractère entre l’espace et le tilde (je cherchais une interprétation du tilde alors qu’il n’y en avait pas).
Mais du coup je ne vois pas pourquoi ça ne supprime pas la ligne.
Hors ligne
#5 Le 28/11/2021, à 10:28
- Sciensous
Re : sed pour éliminer lignes multiples [RÉSOLU]
merci (super)Nany, je vais essayer et je mettrai le retour positif (j'espère) ou non ![]()
pour les détails, j'avais trouvé ça mais ça ne m'avait pas aidé
![]()
édit: oui avec ~ ou } ça bugue; pas avec z à la place de ~
j'avais essayé avec * directement mais pas avec .*
donc résolu pour moi mais pas pour le net ![]()
Dernière modification par Sciensous (Le 28/11/2021, à 10:45)
antiX 19 (Debian Buster) et (L)Ubuntu focal 20.04
( sous LXDE et gnome-shell )
Hors ligne
#6 Le 28/11/2021, à 20:08
- kamaris

Re : sed pour éliminer lignes multiples [RÉSOLU]
En revanche, en cherchant où tu avais bien pu trouver cette ligne sed, j’ai trouvé une commande awk qui marche du feu de dieu et qui m’a fait découvrir seen :
awk '!seen[$0]++' test
seen est juste le nom de la variable tableau ![]()
On trouve aussi souvent a pour « array » :
awk '!a[$0]++' testSinon chez moi la commande de départ fonctionne avec le cas de test donné, c'est bizarre.
Je suis en LANG=fr_FR.UTF-8, mais je suppose que vous aussi.
Hors ligne
#7 Le 28/11/2021, à 20:45
- Sciensous
Re : sed pour éliminer lignes multiples [RÉSOLU]
@ kamaris: je te confirme que j'ai le même LANG
par contre j'ai LANGUAGE=fr_FR:fr_CA (pourquoi CAnadien ?)
j'avais vu aussi cette commande awk tantôt avec seen tantôt avec x donc ne comprenant rien j'ai laissé tomber. Maintenant je suis moins bête ![]()
merci à vous 2
antiX 19 (Debian Buster) et (L)Ubuntu focal 20.04
( sous LXDE et gnome-shell )
Hors ligne
#8 Le 28/11/2021, à 20:51
- kamaris

Re : sed pour éliminer lignes multiples [RÉSOLU]
Au cas où, peux-tu essayer
LC_ALL=C sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' test?
Hors ligne