Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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
ee

et

sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' test

retourne le fichier sans supprimer le aa en double

Quelqu'un saurait le pourquoi du comment ?
merci
wink

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' test

on 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]++' test

Source.

Hors ligne

#3 Le 28/11/2021, à 00:46

nany

Re : sed pour éliminer lignes multiples [RÉSOLU]

nany a écrit :

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' test

C’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]

nany a écrit :

cette partie ([ -~]) que je n’ai pas comprise

C’est tout simple en fait :
1638057978.png
Ç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 smile

pour les détails, j'avais trouvé ça mais ça ne m'avait pas aidé

smile


é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 smile

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]

nany a écrit :

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 big_smile
On trouve aussi souvent a pour « array » :

awk '!a[$0]++' test

Sinon 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 wink

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