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

Langage Perl Discussion :

remplacer mots dans un fichier


Sujet :

Langage Perl

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut remplacer mots dans un fichier
    Bonjour,

    Je dois faire des remplacements dans des fichiers.
    voici la commande que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi -e '30..10000 and s/mot1/mot2/' nom_du_fichier
    Cette commande me permet de remplacer le mot1 par le mot2 entre la ligne 30 et 10000.
    J aimerai savoir comment faire pour faire un remplacement de la ligne X jusqu a la fin du fichier (aulieu de mettre un nemro de ligne super long ).

    Merci !!!

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il y a plusieurs façon, mais la plus lisible sera sûrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i -pe '30..eof and s/mot1/mot2/' nom_du_fichier
    eof() signifie "end of file" et teste si on est arrivé à la fin du fichier.

    --
    Jedaï

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut
    parfait ..... et logique en plus .
    Merci.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut
    Voila j ai encore une petite question.
    J ai ecrit un petit programme perl qui me permet de parcourrir un repertoire et m'affiche les fichiers ayant un certains pattern.
    Je voulais savoir si c'etait possible d'utiliser la commande ci-dessus. Si oui comment fait-on ? Car pour l'instant je dois recopier le contenu de chaque fichier dans un fichier.new tout en remplacant les mots voulus.

    Voici mon code :
    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
      1 #!/usr/bin/perl
      2 
      3 use warnings;
      4 use strict;
      5 
      6 my @l_dirs = ("/home/src", "/home/src/test");
      7 my %hash;
      8 
      9 foreach my $curdir (@l_dirs)
     10 {
     11     opendir(DIR,"$curdir") or die "erreur ouverture $curdir $!\n";
     12     my @l_files = grep { /^par_(.*?)\.src$/ and -f  "$curdir/$_" and -r "$curdir/$_" } readdir(DIR);
     13 
     14     foreach my $file (@l_files)
     15     {
     16         print "$file\n";
     17         open(FILE, "$curdir/$file") or die  "erreur ouverture $file $!\n";
     18         my $num_line = 0;
     19         while (my $line = <FILE>)
     20         {
     21             $num_line++;
     22             if ($line =~ /(.*?)Commentary:(.*?)/)
     23             {
     24                 last;
     25             }
     26         }
     27         close FILE;
     28         #$num_line..eof and "s/A/AAAA/ $curdir/$file"; <---- ICI que j aimerai faire le remplacement.
     29     }   
     30 } 
     31  
     32

    Merci.

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu veux dire mettre à jour un fichier en place ? Nous avons une question de la FAQ sur le sujet.

    --
    Jedaï

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut
    Voila ce que j ai ecris.
    J ai prefere faire la methode 3 car je n ai que a modifier la fin des fichiers.

    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
    42
    43
    44
    45
    46
    47
    48
    49
     
      1 #!/usr/bin/perl
      2 
      3 use warnings;
      4 use strict;
      5 
      6 my @l_dirs = ("/home/src", "/home/src/test");
      7 my %hash;
      8 
      9 foreach my $curdir (@l_dirs)
     10 {
     11     opendir(DIR,"$curdir") or die "erreur ouverture $curdir $!\n";
     12     my @l_files = grep { /^par_(.*?)\.src$/ and -f  "$curdir/$_" and -r "$curdir/$_" } readdir(DIR);
     13 
     14     foreach my $file (@l_files)
     15     {
     16         open(FILE, "$curdir/$file") or die  "erreur ouverture $file $!\n";
     17 
     18         my $memorise = 0;
     19         my $line;
     20         my @l_lines;
     21         while ($line = <FILE>)
     22         {
     23             if ($line =~ /(.*?)Commentary:(.*?)/)
     24             {
     25                 seek (FILE, $memorise, 0);
     26                 @l_lines = <FILE>;
     27                 close FILE;
     28                 last;
     29             }
     30             else
     31             {
     32                 $memorise = tell(FILE);
     33             }
     34         }
     35 
     36         open(FILE, ">>$curdir/$file") or die  "erreur ouverture $file $!\n";
     37         seek (FILE, $memorise, 0);   # <--- je me remet au debut du bloc a changer pour ecrire a partir de la.
     38         foreach my $lin (@l_lines)
     39         {
     40
     41             $lin =~ s/var/VARIABLE/g;
     42 
     43         }
     44 
     45         print FILE @l_lines;
     46         close FILE;
     47     }
     48 }
    Le probleme est que le lignes modifiees est inscrit a la suite du fichier.
    La partie a remplacer est toujours la.

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu as 4 méthodes, 3 sont faciles à utiliser ou en tout cas tu disposes d'exemple complets... Donc tu choisis la dernière, celle pour laquelle il n'y a pas d'exemple, pour laquelle il faut une certaine expérience de la manipulation de fichier et qui est décrite comme "relativement inintéressante"....

    Tu réouvre ton fichier en mode ajout, ce n'est pas une bonne idée pour réutiliser ton offset. A mon avis le mieux serait de simplement ouvrir le fichier en mode lecture-écriture dès le départ. N'oublie pas de faire un petit truncate() en passant.
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    my @l_dirs = ("/home/src", "/home/src/test");
     
    foreach my $curdir (@l_dirs) {
     
      opendir my($dir), $curdir
        or die "erreur ouverture $curdir $!\n";
      my @l_files = grep { m/^par_(.*?)\.src$/ 
    			 and -f  "$curdir/$_" 
    			   and -r "$curdir/$_" } readdir($dir);
     
      foreach my $filename (@l_files) {
        open my($file), '+<:raw', "$curdir/$filename" 
          or die  "erreur ouverture $filename : $!\n";
     
        my $offset = 0;
        my @l_lines;
        while (my $line = <$file>) {
          if ($line =~ /(.*?)Commentary:(.*?)/) {
    	seek $file, $offset, 0;
    	@l_lines = <$file>;
    	last;
          }
          else {
    	$offset = tell $file;
          }
        }
     
        seek $file, $offset, 0;
        truncate $file, $offset;
        foreach my $line (@l_lines) {
          $line =~ s/var/VARIABLE/g;
        }
     
        print $file @l_lines;
        close $file;
      }
    }
    --
    Jedaï

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Tu as 4 méthodes, 3 sont faciles à utiliser ou en tout cas tu disposes d'exemple complets... Donc tu choisis la dernière, celle pour laquelle il n'y a pas d'exemple, pour laquelle il faut une certaine expérience de la manipulation de fichier et qui est décrite comme "relativement inintéressante"....
    C'était la méthode qui me convenait le plus vu que mes modification se font a la fin des fichiers . De plus je trouvais cela interessant car il n'y avait pas d'exemple .
    En tout cas ca marche nickel !!!
    Je t en remercie !!!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    Je parse des fichiers avec pour faires des remplacements.
    Ceci marche bien sauf pour certains fichiers car les caractères accentués sont encodé en latin-1 (je crois) et non en utf-8.

    Je me suis dit que je devrais ouvrir le fichier en utf8 (aulieu de raw) mais il me dit lorsque je vérifie si un mot est contenu dans une ligne (ou il y a un caractère accentué):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Malformed UTF-8 character
    Je voulais savoir comment faire pour faire abstraction de l encoding.

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par berg Voir le message
    Je voulais savoir comment faire pour faire abstraction de l encoding.
    C'est pas possible... Nous vivons dans un enfer point de vue encodage actuellement parce que les encodages ne sont pas du tout homogènes et sont encore moins compatibles qu'auparavant (encodage sur plus de 8 bits, octets illégaux dans certains encodages, etc).

    Alors quelques trucs :
    • Avec "use utf8;" au début de ton script, tu peux écrire ton script (tes regexs, tes strings, tes identifiants) en utf8.
    • Avec le pragma open, tu peux spécifier quel layers utiliser par défaut (donc :utf8 par exemple)
    • tu peux aussi spécifier fichier par fichier avec quels layer les ouvrir
    • le module Encode te permet de faire toutes les conversions nécessaires


    Un petit tutorial pour se fixer les idées (peut-être que je devrais faire une petite traduction, on a eu quelques questions sur le sujet récemment... ??).

    --
    Jedaï

Discussions similaires

  1. Remplacement de caractères ou de mots dans un fichier texte
    Par Jerome Briot dans le forum Téléchargez
    Réponses: 4
    Dernier message: 21/09/2016, 14h03
  2. Remplacer des mots dans un fichier par des nombres
    Par bougnbie dans le forum Langage
    Réponses: 5
    Dernier message: 17/04/2014, 14h06
  3. script shell pour remplacer un mot dans un fichier
    Par MSM_007 dans le forum Linux
    Réponses: 2
    Dernier message: 17/06/2010, 21h37
  4. Remplacer mot dans un fichier text !
    Par Marie.B dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 25/01/2009, 14h38
  5. Réponses: 10
    Dernier message: 29/04/2006, 11h40

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