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 :

Remplacer les CR d'un fichier sans toucher aux crLF de fin de ligne


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut Remplacer les CR d'un fichier sans toucher aux crLF de fin de ligne
    Bonjour,
    J'ai un fichier dont les caractères de fin de ligne est un CRLF. Sur certaines ligne j'ai un CR en plein milieu. Il me faudrait remplacer les CR de milieu de ligne par des blancs, sans toucher au CR de fin de ligne.
    J'ai bien réussi à transformer les CR par des blancs avec tr. Mais il faudrait que je transforme après les blancLF par des CRLF.
    Voilà ce que j'ai fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat ${FICHIER}|tr '\r' ' ' >${FICHIER}.1
    Merci de votre aide.
    Soazig

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    vite fait, je dirais qu'il faut supprimer tous les \r
    (pseudo code)
    puis remplacer les \n par \r\n
    (pseudo code)
    à tester sur une copie du fichier bien sur.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Il ne faut pas supprimer les \r (CR), il faut les remplacer par un espace. Car c'est un fichier qui sera mangé par du cobol. Et une fois la substitution effectué, il faut remplacer le blanc suivi d'un \n (LF) par un LF.
    Mais ça je ne sais pas le faire.

    Merci néanmoins
    Soazig

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    ça revient au même

    tu remplaces tout les CR par un espace

    sed -e"/\r/ /"

    puis tous les espaces suivi d'un LF par un CRLF

    sed -e"/ \n/\r\n/"

    Le problème dans mon code est la prise en compte de l'espace dans la regex.

  5. #5
    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,

    Je ne mets pas de pouce baissé pour ces conseils, mais le coeur y est: Il y a au moins 2 fautes. Tu n'as sûrement pas testé.
    1. Il manque le 's' qui signifie substitution et qui indique l'opération à effectuer.
    2. L'outil sed prend les lignes une à une. Il n'y aura donc jamais de \n au milieu de la ligne, à moins que tu aies manipulé pour en avoir.


    La question qu'il faut plutôt poser est "D'où viennent ces fichiers?"
    On dirait des fichiers venant de Windows qui n'ont pas été nettoyés avant d'être traités. Faudrait commencer par là.

    NB: le CRLF ne sert à rien dans un fichier Unix. Seul \n a un intérêt.

    Sinon, pour répondre comme une brute à la question initiale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r/ /g;s/ $/\r/' monfichier.txt
    Et pour répondre à la deuxième question (différente de celle initiale... ce serait trop simple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r/ /g;s/ $//' monfichier.txt
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour,
    Le fichier est téléchargé sur le site ameli de la sécurité sociale, et oui on est d'accord il est foireux. Le but est de le remettre d'aplomb.
    Je vous rassure il m'a fallu 3heures pour trouver que c'est le fichier qui était foireux et pas le programme qui l'exploitait.

    J'ai essayé ce qu'a proposé Flodelarab à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r/ /g;s/ $//' $FICHIER>$FICHIER_OUT
    et le seul effet est que mon fichier faisait 129 caractères et qu'il en fait 128 maintenant ce qui n'est pas ce qui est souhaité.

    On m'a aussi proposé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cat file | while read line
    do
    echo $line | sed -e "s/ctrl-vctrl-m\(.*\)$/\1/" | read NewLine
    echo $NewLine
    done > NewFile
    où ctrl-vctrl-m doivent être tapé sous vi mais cela ne fonctionne pas non plus, le shell ne se termine pas. De toute façon je ne peux pas avoir de shell contenant des CR car ils seraient supprimés par des moulinettes externes.
    J'avoue ne pas avoir été présentée à sed.

    Je ne voie pas en quoi ce que j'ai écrit sur le deuxième post est en contradiction avec ce que j'ai écrit sur le deuxième.
    Remarque le shell sera utilisé sous l'émulateur MKS ou sous cygwin
    Merci
    Soazig

  7. #7
    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,

    Le plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\r/ /g;s/ $//' fichier | unix2dos
    Ici, on remplace tous les '\r' par un espace, puis on retire l'espace supplémentaire en fin de ligne (donc là, on a un fichier format unix), que l'on retransforme en format dos (les fameux '\r\n' de fin de ligne).
    Cordialement.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    disedorgue le sed que tu propose ne supprime que les espace de fin de ligne sans supprimer les CR. En fait cela me remplace les "r" par des espaces.

    unix2dos ne semble pas disponible sous mks
    Merci
    Soazig

  9. #9
    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
    Bah,
    mks, je connais pas trop, mais à priori, c'est du SCO, donc le sed n'est pas une version gnu, sous cygwin, unix2dos existe bien.

    ce que je ne comprends pas bien, c'est que mon sed est identique à celui de Flodelarab et fonctionne bien sous cygwin (testé avec de mon coté)...

    Sinon, si tu as perl, on devrait pouvoir te le transcrire...
    Cordialement.

  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
    Tu peux aussi tester cette version la plus posix possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\x0d/ /g' -e 's/ $/\x0d/' 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
    Soazig,

    peux-tu nous montrer le résultat de cette commande pour qu'on juge sur pièce?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut Unix sous MKS : KSH !?
    Bonsoir,

    Une recherche vite faite dit que l'unix de MKS est du KSH.

    Un sed qui fonctionne sous bash mais à vérifier sous KSH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r[^\n]/ /g' in > out
    [^\n] : tout caractère autre que NewLine

    Donc, remplace tous les \r par blanc sauf le \r de fin de ligne ( \r\n )
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  13. #13
    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 BlaireauOne Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r[^\n]/ /g' in > out
    Ici, tu perds le caractère qui sera capturé par ton [^\n], de plus, son sed ne semble pas reconnaitre '\r' et dans ce cas, cela doit être pareil pour le '\n' (alors qu'ils font partie de la norme posix).
    Autrement, en gardant cette syntaxe, voici une correction qui fonctionne en temps normal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r\([^\n]\)/ \1/g' in > out
    Sinon, ksh et sed n'ont aucun rapport, ce sont 2 programmes distincts et coté version avec des différences de comportement, il doit y en avoir environ autant qu'il y a de version d'UNIX
    Cordialement.

  14. #14
    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
    1. Il n' y a toujours pas de caractère NewLine dans une ligne sed par défaut
    2. Cette commande est fausse car '\rG' ou '\rU' (ou etc) est remplacé par ' '
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    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
    1. Il n' y a toujours pas de caractère NewLine dans une ligne sed par défaut
    2. Cette commande est fausse car '\rG' ou '\rU' (ou etc) est remplacé par ' '
    Pour le point 1, c'est pas grave, car cela force le fait d'avoir un caractère après le Carriage Return, ce qui n'est pas le cas quand il est en fin de ligne
    Cordialement.

  16. #16
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Moi j'aurais fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i.bak ':a;N;$!ba;y/\r/ /;s/ \n/\r\n/g' fichier
    Par contre je ne peux pas te dire si ça fonctionne avec ta version de sed. L'utilisation de cette commande suppose que le fichier ne contient pas de LF précédé d'un espace.

    Détail de la commande:

    Comme sed travaille ligne par ligne, on l'oblige à placer toutes les lignes dans l'espace de la pattern. Pour cela on utilise une boucle conditionnelle qui s'interrompt une fois la dernière ligne ajoutée. Les caractères LF deviennent alors accessibles dans l'espace de la pattern:

    :a est un label, le label a (on peut l'appeler tartampion ou isidor, c'est pareil)

    N ajoute une nouvelle ligne à l'espace de la pattern.

    $!ba est le test:
    • $! si on est pas à la dernière ligne
    • ba alors retourne au label a


    y/\r/ / effectue la "traduction/translation" des CR en espaces.

    s/ \n/\r\n/g remplace tous les espaces suivis d'un LF en CRLF.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  17. #17
    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
    Résumons ta proposition:
    CRLF -> ' LF' -> CRLF
    Un beau programme qui ne fait rien.

    Pire! Pour le dernier caractère, on a CR -> ' '
    Ce qui n'est pas ce qui est demandé.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Non la proposition est "CR -> espace" puis "espace LF -> CR LF" ce qui a pour conséquence de ne remplacer par un espace que les CR isolés (qui ne précèdent pas un LF).

    Je ne vois pas pourquoi il resterait un CR à la fin. Et d'ailleurs à la fin de quoi? Des lignes; du fichier?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Pour flodelarab le fichier initial fait 59 Mo, le fichier résultant du od 180Mo je ne peux donc pas mettre le résultat sur le forum.
    Si tu veux ausculter le fichier il est http://www.ameli.fr/accueil-de-la-cc...ques/index.php il faut choisir Fichier NX complet
    La proposition de disedorgue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\x0d/ /g' -e 's/ $/\x0d/' $FICHIER>$FICHIER_PROPRE
    Me mets la chaine de caractères "x0d" en fin de ligne sous MKS.

    Ce que j'ai testé et qui fonctionne même si cela ne correspond pas complétement à ma demande initiale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat ${FICHIER}|tr '\r' ' '|sed 's/ $//'>$FICHIER_PROPRE
    Sous MKS, j'ai bien en fin de ligne le CRLF attendu, sous cygwin je n'ai que le LF, mais le programme cobol a l'air de s'en accommoder très bien.

    Merci à tous pour votre aide
    Soazig

  20. #20
    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
    Pour flodelarab le fichier initial fait 59 Mo
    Désolé pour le fichier si gros. Je ne voulais qu'un extrait. Les 10 premières lignes aurait peut-être suffit. Mais comme ton problème est réglé...

    le cat ne sert à rien, le tr non plus puisque tu utilises sed. Et au final, tu as simplement supprimé les \r.

    Tu as bien compris que Windows fait ses fin de lignes avec CRLF alors que Linux LF. Si ce fichier est destiné à retourné sous Windows, attention, la fin de ligne doit redevenir CRLF. Sinon, Windows ne verra qu'une ligne dans tout le fichier.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [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
  2. Réponses: 2
    Dernier message: 20/03/2008, 09h38
  3. Réponses: 24
    Dernier message: 25/09/2007, 11h53
  4. 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
  5. remplacer les String dans un fichier
    Par makohsarah dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2006, 13h34

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