IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[sed] Convertir \r\n en \r sans toucher aux lignes qui se terminent par \n


Sujet :

Shell et commandes GNU

  1. #1
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut [sed] Convertir \r\n en \r sans toucher aux lignes qui se terminent par \n
    Bonjour,

    Je me heurte aux limites de mes (faibles) compétences en sed.

    J'ai un fichier csv au format Unix (Fin de ligne \n).
    A l'intérieur, certaines lignes intègrent des commentaires comportant des sauts de lignes au format DOS (\r\n).
    Ce que je souhaiterais faire, c'est convertir ces \r\n en \r pour ne plus avoir de saut de ligne intempestif à l'intérieur d'une même ligne logique.

    J'en étais arrivé à ça, mais ça ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r -e '/\r/ n;s/\r\n/\r/' fichier
    J'appelle à l'aide les magiciens de sed.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Utilise la fin de ligne $ :
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,

    @Flodelarab: relis bien le problème du monsieur, c'est plus complexe, il veut garder le '\r' pas le '\n'

    Si le fichier est vraiment terminal en format unix, tu peux le faire avec quelque chose du genre en gnu sed (pas testé) :
    Cordialement.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    voilà! avec un -z, comme dizedorgue
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Je venais juste poster le résultat positif de mes recherches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -z -r -e '/\r/ n;s/\r\n/\r/'
    Je vais essayer la version plus courte.

    Merci à tous les deux de vous être penché sur mon problème
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Version courte validée !
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Pas très posix le -z
    https://pubs.opengroup.org/onlinepub...tml#tag_20_116
    Cordialement

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    ça tombe bien, on n'est pas dans le forum posix mais gnu...

    Sinon, pour les puristes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  ':b;$!{N;bb;};s/\r\n/\r/g'
    @al1_24: je pense que tu voulais mettre 'N' dans ton sed et non 'n' dans ta solution, mais de toute façon, tu aurais potentiellement un problème avec cette solution dans le cas où tu aurais 2 '\r\n' pour une même ligne.
    Cordialement.

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Pas très posix le -z
    Cette formulation est intéressante. Car, justement, cela demande une solution POSIX pour rendre un fichier non-POSIX. A priori, je pense que sed-posix ne sait pas faire. et les commandes sed ':b;$!{N;bb;};s/\r\n/\r/g' et sed -z 's/\r\n/\r/g' ne font pas la même chose.

    Soit un fichier blablabla\r\nblablabla\r\nblablabla\r\n.

    • sed -z 's/\r\n/\r/g' transforme le fichier en blablabla\rblablabla\rblablabla\r. Ce fichier n'est plus POSIX puisque toute ligne doit finir par \n.
    • sed ':b;$!{N;bb;};s/\r\n/\r/g' transforme le fichier en blablabla\rblablabla\rblablabla\r\n. Ce fichier est POSIX mais ce n'est pas ce qui est demandé par le PO.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Soit un fichier blablabla\r\nblablabla\r\nblablabla\r\n.
    Bah, moi je dirais que ce type de fichier n'est pas non plus dans le format spécifié par le demandeur, puisqu'il précise bien que sont fichier est avec des lignes terminal au format UNIX et que seul ces champs peuvent avoir des '\r\n' .
    D'ailleurs, j'avais même précisé que la solution avec -z ne fonctionnait que si le format est respecté.

    Par contre, comme tu le dis, j'ai déjà rencontré des sed (dit posix), qui rajoutait le '\n' sur la dernière ligne même s'il n'existait pas dans le fichier d'origine ce qui rend impossible de ne garder que le '\r' en fin de fichier.
    Cordialement.

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Ce qui me fait frémir, c'est que \r a vraiment une action. On revient en arrière si la console le permet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo -e "Bonjour\rtout\rle\rmonde"
    mondeur
    $ echo -e "Bienvenue\rtoute\rla\rpopulation"
    population
    Dans le second cas, cela peut devenir ardu de débuguer et expliquer pourquoi "seule la dernière ligne est traitée". Ce qui est faux. C'est juste qu'elle écrase tout.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Dans ces cas là, pour retirer les doutes, je pipe les sorties sur cat -A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo -e "Bienvenue\rtoute\rla\rpopulation"| cat -A
    Bienvenue^Mtoute^Mla^Mpopulation$
    Cordialement.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Dans ces cas là, pour retirer les doutes, je pipe les sorties sur cat -A:
    Et pour ceux qui, soit par choix, soit par contrainte, sont plus POSIX (et qui n'ont rien à faire dans ce forum...) et pour qui l'option cat -A n'est pas reconnue, on peut utiliser od -bc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat -A
    cat: illegal option -- A
    usage: cat [-benstuv] [file ...]
     
    $ echo -e "Bienvenue\rtoute\tla\rpopulation"| od -bc
    0000000   102 151 145 156 166 145 156 165 145 015 164 157 165 164 145 011
               B   i   e   n   v   e   n   u   e  \r   t   o   u   t   e  \t
    0000020   154 141 015 160 157 160 165 154 141 164 151 157 156 012        
               l   a  \r   p   o   p   u   l   a   t   i   o   n  \n
    ou les options POSIX de cat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo -e "Bienvenue\rtoute\tla\rpopulation" | cat -v
    Bienvenue^Mtoute	la^Mpopulation
     
    $ echo -e "Bienvenue\rtoute\tla\rpopulation" | cat -e
    Bienvenue^Mtoute	la^Mpopulation$
     
    $ echo -e "Bienvenue\rtoute\tla\rpopulation" | cat -t
    Bienvenue^Mtoute^Ila^Mpopulation

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Pour rappel, le '-e' de echo n'est pas posix non plus...

    Sinon, on peut aussi le faire avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ printf "Bienvenue\rtoute\tla\rpopulationblablablablablablablablablablablablablablablablablablabla_ici_fin\n" | sed -n 'l'
    Bienvenue\rtoute\tla\rpopulationblablablablablablablablablablablablab\
    lablablablablablabla_ici_fin$
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer les CR d'un fichier sans toucher aux crLF de fin de ligne
    Par soazig dans le forum Shell et commandes GNU
    Réponses: 22
    Dernier message: 18/09/2014, 15h29
  2. [AC-2010] Majuscule premiere lettre, sans toucher aux autres
    Par petitours dans le forum IHM
    Réponses: 5
    Dernier message: 17/07/2013, 00h07
  3. Réponses: 1
    Dernier message: 26/08/2011, 00h19
  4. [CTP4]Modifier le modele sans toucher aux données
    Par john85 dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 12/07/2011, 09h45
  5. Dimension titres de chapitre sans toucher aux autres polices
    Par profilien dans le forum Mise en forme
    Réponses: 1
    Dernier message: 24/08/2007, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo