Contenu | Rechercher | Menus

Annonce

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 15/11/2010, à 23:39

Malizor

[Résolu] sed et les retours chariot

Salut à tous,

Je sais qu'il existe d'autres solutions et que le sujet a déjà été indirectement abordé à plusieurs endroits sur Internet, mais j'aimerais poser la question de façon plus directe et concrète (j'ai simplifié la situation au maximum pour essayer d'isoler le cœur du problème).

Considérons le teste suivant placé dans le fichier « plop » :

"Rhythmbox a détecté un périphérique qui est probablement un iPod non "
"initialisé ou endommagé. Il doit être initialisé avant de pouvoir être "
"utilisé par Rhythmbox, mais cette opération va supprimer toute information "
"de chansons qui pourrait se trouver sur l'iPod. Si vous souhaitez "
"initialiser l'iPod, complétez les informations ci-dessous. Si ce n'est pas "
"un iPod ou que vous ne souhaitez pas l'initialiser, cliquez sur Annuler."

(extrait du .po de Rhythmbox)

Pourquoi la commande suivante fonctionne et remplace chaque espace par un saut de ligne :

sed 's/ /\n/g' plop

Et pourquoi la commande suivante ne fonctionne pas ? (elle devrait logiquement remplacer les sauts de lignes par des espaces)

sed 's/\n/ /g' plop

(ce n'est pas le fait de remplacer par un espace qui pose problème)

Merci de vos lumières wink

Dernière modification par Malaria (Le 17/11/2010, à 21:05)


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

En ligne

#2 Le 15/11/2010, à 23:59

grim7reaper

Re : [Résolu] sed et les retours chariot

Salut,

Je vais peut-être dire des bêtises mais il me semble que sed est un outil qui travail ligne à ligne. Il est donc possible que '\n' soit utilisé comme délimiteur et ne soit donc pas compris dans la chaîne quand il la traite.
Il me semble que c'est pour cette raison qu'on dit que sed n'est pas adapté à ce genre de traitement (par contre tr l'est).

Enfin, je peux me tromper car les commandes du shell sont loin d'être ma spécialité.

Dernière modification par grim7reaper (Le 16/11/2010, à 00:02)

Hors ligne

#3 Le 16/11/2010, à 00:14

Malizor

Re : [Résolu] sed et les retours chariot

C'est une suggestion intéressante, merci.

Quoi que, le « g » situé à la fin signifie bien « global », non ? Cette option n'est-elle pas faite justement pour ça ?
De plus, si '\n' est effectivement pris comme un séparateur, on pourrais croire que ça marcherais au moins pour la première occurrence, non ?

Et encore de plus, la commande suivante ne marche pas non plus, ce qui me fait croire que le \n est bien pris en compte :

sed 's/"\n/ /g' plop

(avec un « " » en plus)

Si aucune des deux commandes citées dans mon premier post ne fonctionnait, je pourrais trouver ça logique, mais là...

Dernière modification par Malaria (Le 16/11/2010, à 00:17)


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

En ligne

#4 Le 16/11/2010, à 00:21

grim7reaper

Re : [Résolu] sed et les retours chariot

Ce que j'ai voulu dire c'est que sed ne "lit" pas le '\n', il s'en sert juste pour reconnaître la fin de la ligne.
Par exemple, si dans le fichier on a la ligne

"Rhythmbox a détecté un périphérique qui est probablement un iPod non "\n

(J'ajoute le '\n' pour l'exemple, mais c'est bien le caractère de fin de ligne invisible et pas un truc ajouté)
Alors sed va travailler sur

"Rhythmbox a détecté un périphérique qui est probablement un iPod non "

Il lit la ligne jusqu'au séparateur, mais celui-ci n'est pas inclus ce qui expliquerais pourquoi les commandes de substitution ne fonctionne pas (vu qu'il n'y a rien à substituer).

Malaria a écrit :

Quoi que, le « g » situé à la fin signifie bien « global », non ? Cette option n'est-elle pas faite justement pour ça ?

Le 'g' signifie bien « global » mais il sert juste à remplacer toutes les occurences sur une ligne.

Malaria a écrit :

Si aucune des deux commandes citées dans mon premier post ne fonctionnait, je pourrais trouver ça logique, mais là...

La première fonctionne bien car tu lui demandes de remplacer des espaces (bien présent dans la chaîne) par '\n', alors que dans la seconde tu lui demandes de remplacer '\n' (absent de la chaîne si mon hypothèse est bonne) par une espace.


Encore une fois, ce n'est qu'une supposition : il faudrait que les pros du sed confirme/infirme smile.

Dernière modification par grim7reaper (Le 16/11/2010, à 00:24)

Hors ligne

#5 Le 16/11/2010, à 00:25

Malizor

Re : [Résolu] sed et les retours chariot

Ok, excuse moi, j'ai lu ton message précédent un peu trop vite.

Je vais creuser un peu de mon côté en attendant confirmation, mais ton explication se tient parfaitement.

Dernière modification par Malaria (Le 16/11/2010, à 00:27)


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

En ligne

#6 Le 17/11/2010, à 21:07

Malizor

Re : [Résolu] sed et les retours chariot

Je confirme.

Pour ceux qui sont intéressés, le code suivant permet de tout de même utiliser sed dans cette situation :

sed ':z;N;s/\n/ /g;bz'

(je ne suis pas sûr d'avoir bien compris ce qu'il faisait, mais ça marche)

Dernière modification par Malaria (Le 17/11/2010, à 21:09)


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

En ligne

#7 Le 17/11/2010, à 21:19

grim7reaper

Re : [Résolu] sed et les retours chariot

Bon, je ne m'étais pas trompé finalement ^_^.
Sinon, autant utilisé un outil adapté comme tr plutôt que de bidouiller un outil pour lui faire faire une tâche inadapté wink.

Hors ligne

#8 Le 17/11/2010, à 21:49

Malizor

Re : [Résolu] sed et les retours chariot

Certes, mais j'utilise sed partout dans le script que je suis en train de faire, donc ça aurait été moins harmonieux avec un tr au milieu tongue

De plus, le problème tel que décrit ici est simplifié par rapport a mon « vrai » problème (reconnaissance d'un motif avec entre autre un \n), du coup sed me parait toujours plus pratique que tr dans ce cas (je suis encore plus n00b en tr qu'en sed si tu préfères lol).

Merci à toi.


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

En ligne

#9 Le 26/01/2011, à 13:40

nordinatueur

Re : [Résolu] sed et les retours chariot

Malaria a écrit :
sed ':z;N;s/\n/ /g;bz'

(je ne suis pas sûr d'avoir bien compris ce qu'il faisait, mais ça marche)

« :<chaine> » indique un endroit où sed pourra revenir, quand il sera appelé par « b<chaine> »
« N » ajoute la ligne suivante à la ligne actuelle, en les séparant par « \n »
Donc ton script, ajoute la ligne suivante avec le délimiteur « \n », remplace « \n » par une espace, et recommence au début.

Ce tuto en trois parties est pas mal... http://www.gentoo.org/doc/fr/articles/l-sed1.xml


Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !

Hors ligne

#10 Le 26/01/2011, à 15:09

ehmicky

Re : [Résolu] sed et les retours chariot

Salut, tu as tout un tas de commandes avec sed prévues justement pour la recherche multi-ligne et ligne par ligne (défaut) : les majuscules R, W, P, D, N, et les commandes sur le hold buffer x, h, H, g et G.


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#11 Le 26/01/2011, à 18:41

Malizor

Re : [Résolu] sed et les retours chariot

Merci à tous tongue


« Prouver que j'ai raison serait accorder que je puis avoir tort. »  -  Beaumarchais  ← Le premier troll ?

En ligne