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 :

Supprimer les retours à la ligne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut Supprimer les retours à la ligne
    Bonsoir,

    J'ai un sérieux problème pour traiter un fichier.
    Voici son contenu initial :

    AAAAAAAAA
    $$$BBBBBBB
    $$$CCCCCC
    $$$DDDDDD
    EEEEEEEEEE
    FFFFFFFFFF
    $$$GGGGGG
    HHHHHHHHH
    $$$IIIIIIIIIII
    $$$JJJJJJJJJ

    J'aimerai retraiter ce fichier pour obtenir le résultat suivant :

    AAAAAAAAABBBBBBBCCCCCCDDDDDD
    EEEEEEEEEE
    FFFFFFFFFFGGGGGG
    HHHHHHHHHIIIIIIIIIIIJJJJJJJJJ

    Ce qui revient à dire que je souhaite supprimer le retour chariot d'un enregistrement dès lors que la ligne qui le suit commence par $$$.

    Avez-vous une idée comment le faire ?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonsoir,



    Il suffit de remplacer ’\n$$$’ par "" dans la chaîne de caractères qui constitue la base du fichier.



    Il faut lire cette chaîne, la traiter par une fonction replace() et réécrire la chaîne dans le fichier.

    Il ne faut surtout pas rentrer dans un programme qui examine les lignes l’une après l’autre.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut
    Je suis à la recherche des commandes unix qui me permettront d'obtenir ce résultat.

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Normalement c'est réalisable avec un sed multiligne, mais je suis un peu rouillé de ce coté là.

    alors voici une solution possible en perl que l'on peut trouver facilement sur des plate formes unix.

    Ce n'est pas la plus élégante façon de faire, cela fait longtemps que je n'ai pas fait de perl, mais elle répond a ton besoin. ce script suppose que ton fichier s'appelle "titi"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #!/bin/perl
     
    #ouverture du fichier
    open(FILE,"titi") || die ("Erreur d'ouverture du fichier");
     
    # lecture du contenu dans un tableau.
    @fileContent = <FILE>;
     
    # fermeture du fichier.
    close FILE;
     
    # parcours du tableau.
    for ($i=0; $i < @fileContent ; $i++) {
     
     # initialisation de la ligne.
     $line = $fileContent[$i];
     
     # recherche des lignes suivante commencant par $$
     for ($j = $i + 1; $j < @fileContent ; $j++) {
     
         if ($fileContent[$j] =~ /^\$\$/) {
             #*la ligne suivante contiens $$
             #*on les supprime
    	 $fileContent[$j] =~ s/^\$\$//;
             # on la concatene a la ligne courante
    	 $line = $line . $fileContent[$j];
             # on vire les saut de ligne.
    	 $line =~ s/\n//;
             #*on incrémente i pour ne pas la prendre en compte  
             # lors du retour a la boucle principale 
    	 $i++;
         } else {
             #*cette ligne ne commence pas pas $$, fin de la chaine 
             #*et retour à la boucle principale.
    	 last;
         }
     }
     # affichage de la ligne lue
     print $line;
    }

  5. #5
    Membre éprouvé Avatar de exodev
    Inscrit en
    Septembre 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2009
    Messages : 201
    Par défaut
    Hello,

    avec bash et quelques lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #!/bin/bash
     
    firstLine=1;
    while read line; do
    	if [[ ${line:0:3} == "\$\$\$" ]]; then
    		echo -n "${line:3}";
    	elif [[ $firstLine -eq 1 ]]; then
                    # cas de la premiere ligne
    		echo -n "$line";
    	else
    		echo -ne "\n$line";
    	fi
    	firstLine=0;
    done < data.txt

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 731
    Par défaut
    ceci semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    echo 'AAAAAAAAA
    $$$BBBBBBB
    $$$CCCCCC
    $$$DDDDDD
    EEEEEEEEEE
    FFFFFFFFFF
    $$$GGGGGG
    HHHHHHHHH
    $$$IIIIIIIIIII
    $$$JJJJJJJJJ' | sed ':mark;N;/\$\$\$/s/\n$$$\(.*\)/\1/;bmark'
    AAAAAAAAABBBBBBBCCCCCCDDDDDD
    EEEEEEEEEE
    FFFFFFFFFFGGGGGG
    HHHHHHHHHIIIIIIIIIIIJJJJJJJJJ
    quelques liens utiles :
    /usr/share/doc/sed/sed*/sed.html
    http://sed.sourceforge.net/sed1line_fr.html

  7. #7
    Membre actif
    Avatar de debianhunter
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 63
    Par défaut
    Un petit script sed (pour se derouiller ;o) )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # cat > script
    #line does not starts with $$$
    /^\$\$\$/!{
    #invert pattern buffer and hold to get previous buffer
       x
    #make change to pattern
       s/\n\$\$\$//g
    #print pattern
       p
    }
    #line starts with $$$
    /^\$\$\$/ {
    #append to hold buffer
       H
    }
    # cat plop
    AAAAAAAAA
    $$$BBBBBBB
    $$$CCCCCC
    $$$DDDDDD
    EEEEEEEEEE
    FFFFFFFFFF
    $$$GGGGGG
    HHHHHHHHH
    $$$IIIIIIIIIII
    $$$JJJJJJJJJ
    
    # sed -n -f script plop
    
    AAAAAAAAABBBBBBBCCCCCCDDDDDD
    EEEEEEEEEE
    FFFFFFFFFFGGGGGG
    HHHHHHHHHIIIIIIIIIIIJJJJJJJJJ
    #
    Un peu de lecture.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut
    Merci à vous tous pour les réponses.
    J'ai désormais le choix.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut
    sed ':mark;N;/\$\$\$/s/\n$$$\(.*\)/\1/;bmark'

    Je dois admettre que sed est vraiment puissant.
    A chaque fois que je vois une expression en sed, je suis impressionné par sa puissance.

    Pourriez-vous m'expliquer comment interpréter oralement cette solution ?
    Que veut dire marK ? et le reste d'ailleurs ?

    Merci

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

Discussions similaires

  1. [MySQL] Supprimer les retours à la ligne
    Par p0Kep0K dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 18/06/2012, 12h54
  2. [PHP-JS] Supprimer les retours à la ligne
    Par defacta dans le forum Langage
    Réponses: 3
    Dernier message: 08/10/2007, 14h23
  3. Supprimer les retours à la ligne dans une chaine
    Par koktel_dfr dans le forum C
    Réponses: 22
    Dernier message: 03/05/2007, 11h12
  4. [CSV] supprimer les retours à la ligne
    Par illegalsene dans le forum Langage
    Réponses: 3
    Dernier message: 09/01/2006, 17h14
  5. [RegEx] supprimer les retours à la ligne
    Par illegalsene dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 11h53

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