tailles de lignes fixes

tailles de lignes fixes - Perl - Programmation

Marsh Posté le 12-08-2008 à 17:42:28    

Bonjour  :hello: ,
 
Je suis en train de développer un script shell (ksh) qui manipule du contenu de fichiers.  
Mon fichier en sortie doit avoir ses lignes avec une longueur fixe.
Cependant mon fichier peut contenir des caractères binaires 00 01 02 ... qui sont interprétés comme des retour chariot par la plupart des commandes shell comme sed, cut, awk ...
J'ai découvert que les commandes perl réagissent bien avec les "low values".
 
Il me reste un problème : fixer la taille finale des lignes (tronquer chaque ligne à une taille fixe)
 
Voici le bout de script qui me pose problème :
(le cut tronquera au premier low value trouvé sans considérer la suite de la ligne)
 
tailleLigne=100 #par exemple
cat $fichierIn | cut -b 1-${tailleLigne} >> $fichierOut

 
Je n'ai pas trouvé d'exemple de ce style (pack(), substring(), split() ... ?)  :heink:  
Merci pour votre aide

Reply

Marsh Posté le 12-08-2008 à 17:42:28   

Reply

Marsh Posté le 13-08-2008 à 11:12:47    

Si tu as une chaine de texte $string, et que tu veux la decouper en un array @string_parts de sous-chaines de taille $maxSize, il y a le code suivant, particulièrement élégant:
@string_parts = $string =~ /(.{1,$maxSize})/go;
 
Apres, il te suffit d'adapter a tes besoins.
Par exemple ce code ci va tronquer a 8 caracteres par ligne un fichier passé en entrée:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my $maxSize = 8;
  5. while (<STDIN> ) {
  6.    print /(.{1,$maxSize})/o, "\n";
  7. }


Tandis que celui la va wrapper a 8 caracteres par ligne un fichier passé en entrée:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my $maxSize = 8;
  5. while (<STDIN> ) {
  6.    print ((join "\n", (/(.{1,$maxSize})/go)), "\n" );
  7. }


 
A+,


Message édité par gilou le 13-08-2008 à 11:25:43

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-08-2008 à 15:40:38    

Merci pour ta réponse, le premier exemple répond exactement à mon besoin :)
 
Intégré dans mon script sh ça donne :

perl -e 'my $maxSize = $ARGV[0];
while (<STDIN> ) {
   print /(.{1,$maxSize})/o, "\n";
}' $tailleLigne < $fichierIn > $fichierOut

 
 :hello:


Message édité par riffer le 13-08-2008 à 17:07:22
Reply

Marsh Posté le 28-08-2008 à 01:03:40    

perl étant l'ami des choses écrites en une ligne, il peut y avoir plus "court"
 

Code :
  1. /*avec la regexp*/
  2. perl -e 'print map{(/(.{1,$ARGV[0]})/o)[0]."\n"} <>' $taille_line <$fic_in > $fic_out
  3. /*ou encore autre possibilité avec substring*/
  4. perl -e 'print map{substr($_,0,$ARGV[0])."\n"}<>' $taille_line < $fic_in > $fic_out


Message édité par dreameddeath le 29-08-2008 à 00:56:15
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed