Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 26/02/2010, 05h34   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
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 :
<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,
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 07h03   #2
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bonjour,

Rapidement, sans test, voici quelque chose qui devrait s'approcher de la solution:
Code :
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).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 08h57   #3
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bon, je me corrige, après tests. Ce code fonctionne:
Code :
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 :
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).

Dernière modification par jmelyn ; 26/02/2010 à 09h34.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 09h36   #4
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
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 :
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 :
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 :
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).

Dernière modification par laloupiote ; 26/02/2010 à 09h53.
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 09h51   #5
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
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 :
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).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 09h55   #6
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
Oui, mais le fichier que j'utilise est lui-même une copie
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 10h03   #7
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Sur quelle distribution tournes-tu? Pour plus de sureté, essaie en une seule ligne:
Code :
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).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2010, 10h12   #8
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
Merci beaucoup !
Là c'est parfait, ça roule
Je vais étudier cela de beaucoup plus près
Je suis sous Fedora 12
Encore merci
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 21h51.


 
 
 
 
Partenaires

Hébergement Web