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 des sauts de lignes avec sed (ou autre chose)


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut supprimer des sauts de lignes avec sed (ou autre chose)
    Bonjour,

    J'ai un très gros fichier
    En principe, chaque ligne devrait être construite sur le modèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div xxxxxx>bla bla bla></div>
    Mais certaines lignes sont coupées par un saut de ligne
    Je cherche donc à supprimer le saut de ligne lorsqu'elle ne se termine pas par </div> et à le remplacer par un espace.
    Ou pour dire les choses autrement, à joindre les lignes qui commencent par un caractère alphanumérique à la ligne précédente en insérant un espace.

    Complication supplémentaire : la même ligne est parfois coupée plusieurs fois.
    Et je ne trouve pas.

    Bien cordialement,

  2. #2
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    Rapidement, sans test, voici quelque chose qui devrait s'approcher de la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    awk '
    {
      line=$0
      while ($0 !~ "</div>$")
      {
        getline
        line+=$0
      }
      print line
    }' fichier > fichier_nouveau
    Un problème bien posé est déjà résolu (H. Bergson).

  3. #3
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bon, je me corrige, après tests. Ce code fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    awk '
    {
      printf "%s", $0
      while ($0 !~ /<\/div>$/)
      {
        getline
        printf "%s", $0
      }
      print ""
    }' fichier > fichier_nouveau
    Edit: une petite variante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk '
    /<\/div>$/ {print}
    ! /<\/div>$/ {printf "%s", $0}
    }' fichier > fichier_nouveau
    Un problème bien posé est déjà résolu (H. Bergson).

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Merci de votre aide, mais ça ne va pas. Quand je lance la commande, ça mouline un maximum et ça ne s'arrête pas. Je ne connais pas encore awk. Ça va être l'occasion de m'y mettre pour voir ce que je peux corriger

    EDIT : Pardon, je n'avais pas vu le second message. Il doit quand même y avoir une erreur dans la sortie du code parce que je me retrouve avec un fichier_nouveau qui gonfle à vue d'oeil (130Mo en quelques secondes). La variante signale une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk: cmd. ligne:3: }
    awk: cmd. ligne:3: ^ syntax error
    J'ai supposé que c'était la première acolade qui manquait, mais après l'avoir rajoutée, j'ai toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk: cmd. ligne:1: /<\/div>$/ {print}
    awk: cmd. ligne:1:            ^ syntax error
    awk: cmd. ligne:2: ! /<\/div>$/ {printf "%s", $0}
    awk: cmd. ligne:2:              ^ syntax error

    De mon côté, j'ai trouvé ça avec sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -e :a -e '$!N;s/\n\([a-zA-Z0-9]\)/\1/;ta' -e 'P;D' fichier
    Ça a l'air de marcher, mais je ne suis pas sûr : le fichier est tellement gros qu'une vérification visuelle n'est possible que de façon aléatoire et pas à 100%.

    J'aurais préféré une solution qui prend en considération la fin de la ligne plutôt que le début : j'aurais été plus garanti du résultat (je ne suis pas sûr que le debut de ligne soit toujours toujours un caratère alphanumérique (c'est le cas pour les premières occurences trouvées dans le fichier, mais encore une fois, il n'est pas possible de l'examiner en entier).

  5. #5
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Ma première proposition est fausse, elle boucle à l'infini. Mais les deux autres (notamment la troisième) est standard et devrait fonctionner partout.

    Attention avec sed: pour tester, il faut mieux éviter d'utiliser l'option -i pour toujours conserver le fichier original:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '...' fichier > fichier_nouveau
    Une fois que la commande fonctionne de manière sûre, il suffit d'ajouter l'option -i.

    Edit: Généralement, la commande sed est moins lisible que awk: elle ne fonctionne qu'avec des expressions régulières. La commande awk est souvent plus verbeuse puisqu'elle possède un vrai langage, mais c'est plus clair. Tu peux comparer ton résultat avec celui que tu obtiens en utilisant awk.
    Un problème bien posé est déjà résolu (H. Bergson).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Oui, mais le fichier que j'utilise est lui-même une copie

  7. #7
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Sur quelle distribution tournes-tu? Pour plus de sureté, essaie en une seule ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/<\/div>$/ {print} ! /<\/div>$/ {printf "%s", $0}' fichier
    Tu laisses sortir dans le terminal et tu fais Ctrl + C pour stopper après quelques secondes. Tu vois ainsi rapidement si le résultat est correct, sans remplir des fichiers énormes.
    Un problème bien posé est déjà résolu (H. Bergson).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Merci beaucoup !
    Là c'est parfait, ça roule
    Je vais étudier cela de beaucoup plus près
    Je suis sous Fedora 12
    Encore merci

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

Discussions similaires

  1. Gestion des sauts de ligne avec POI
    Par chrime71 dans le forum Général Java
    Réponses: 0
    Dernier message: 01/07/2010, 16h47
  2. Saut de ligne avec sed
    Par melmouj dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 11/12/2009, 14h03
  3. Creer des nouvelles lignes avec sed
    Par hpavavar dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 24/10/2009, 15h58
  4. suppression des lignes avec sed
    Par dngaya dans le forum Linux
    Réponses: 1
    Dernier message: 29/09/2008, 21h23
  5. changer un textarea par fonction JS : texte avec des sauts de ligne
    Par agrotic dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/10/2006, 14h08

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