[gull] Script rechercher-remplacer

Marc SCHAEFER schaefer at alphanet.ch
Thu Jun 16 09:49:02 CEST 2005


On Wed, Jun 15, 2005 at 08:41:08PM +0200, Claude Paroz wrote:
> Mais mon code n'est justement pas complet, car il ne contient pas la
> partie interactive qui s'arrête à chaque remplacement possible pour
> demander à l'utilisateur s'il souhaite effectuer le remplacement ou non.
> C'est là que je bloque...

Effectivement, les commandes de base ne prévoient pas cela.

De toutes les solutions possibles, la piste Perl me semble la meilleure
car le language intègre les regexps et est raisonnablement
multiplateforme.

my $regexp = 'string to change';
my $dest = 'dest string';

my $error_reason = 'unknown',
my $result = 0; # SUCCESS

my @files = get_file_list(); # à implémenter, p.ex. glob('*.xml');
foreach my $file_name (@files) {
   local(*FILE);
   if (open(FILE, '<', $file_name)) {
      my $something_changed = 0;

      my $tmp_file_name = $file_name . '.NEW';
      local(*FILE_OUT);
      if (open(FILE_OUT, '>', $tmp_file_name)) {
         my $count = 1;
         while (my $line = <FILE>) {
            chomp $line;
            if ($line =~ /$regexp/) {
               my $new_line = $line;
               $new_line ~= s/$regexp/$dest/; 

               print "\n";
               print "< ", $line, "\n";
               print "> ", $new_line, "\n";
               print "Effectuer le changement ?: ";
               my $answer = <STDIN>;
               if ($answer ~= /^[YyoO]/) {
                  $line = $new_line;
                  $something_changed = 1;
               }
            }
            print FILE_OUT $line, "\n";
            $count++;
         }

         if (!close(FILE_OUT)) {
            $error_reason = 'error close()ing OUT: ' . $!;
            $result = 1;
         }
      }
      else {
         $error_reason = 'error open()ing OUT: ' . $!;
         $result = 1;
      }

      if (!close(FILE)) {
         $error_reason = 'error close()ing: ' . $!;
         $result = 1;
      }

      if (($result == 0) && $something_changed) {
         # POSIX-compatible rename assumed (non necessarily atomic)
         if (!rename($tmp_file_name, $file_name)) {
            $error_reason = 'error rename()ing: ' . $!;
            $result = 1;
         }
      }
   }
   else {
      $error_reason = 'error open()ing ' . $file_name . ': ' . $!;
      $result = 1;
   }
}

# traitement $error_reason/$result

non testé.



More information about the gull mailing list