[PERL] regexp avec caractres spéciaux

regexp avec caractres spéciaux [PERL] - Perl - Programmation

Marsh Posté le 29-09-2006 à 08:55:37    

Bonjour à tous!
 
j'ai un petit problème stupide:
j'ai une substitution qui ne veut pas fonctionner lorsque j'ai des "caracteres spéciaux" dans la chaine.
 

Code :
  1. $file = "rep/subdir/00 - [LESS] Various Artists";
  2. $filename = "00_-_[LESS]_Various_Artists"
  3. s/$file/$newfile/;


 
visiblement, à cause du "[", il ne trouve pas la chaine dans $file ...
et n'étant pas un pro de la regexp je ne sias pas trop comment "protéger" les caractères spéciaux...
 
Si qqn à une idée,...

Reply

Marsh Posté le 29-09-2006 à 08:55:37   

Reply

Marsh Posté le 29-09-2006 à 11:46:06    

Bonjour,
 
soit il manque une info intéressante non montrée ici de ton code, soit je vois 2 erreurs :
 
s/$file/$newfile/;
 
1) Où est la variable $newfile ?
 
2) Telle quelle, ta syntaxe applique le remplacement sur la variable $_


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO
Reply

Marsh Posté le 29-09-2006 à 11:54:23    

Merci pour ta réponse :)
 
Oui en effet j'ai pas mis tout le code juste la chaine a remplacer et la chaine sensément remplacée.
 
Le script en entier:
 

Code :
  1. find ./ -print | tac | /usr/bin/myrename.pl '($file) = (m|.+/(.+)|); $file = $_ if (!defined($file));($newfile = $file) =~ s/ /_/g; s/$file/$newfile/;'


 
et le script myrename:

Code :
  1. #!/usr/local/bin/perl
  2. #
  3. # Usage: rename perlexpr [files]
  4. ($regexp = shift @ARGV) || die "Usage:  rename perlexpr [filenames]\n";
  5. if (!@ARGV) {
  6.    @ARGV = <STDIN>;
  7.    chomp(@ARGV);
  8. }
  9. foreach $_ (@ARGV) {
  10.    $old_name = $_;
  11.    eval $regexp;
  12.    die $@ if $@;
  13.    rename($old_name, $_) unless $old_name eq $_;
  14. }
  15. exit(0);


 
(tout ça pour renommer récursivement snif)
 
avec  

Code :
  1. find ./ -print | tac | /usr/bin/myrename.pl '($file) = (m|.+/(.+)|); $file = $_ if (!defined($file));($newfile = $file) =~ s/ /_/g; s/(.+)/$newfile/;'


 
$newfile replace bien toute la chaine précédente mais du coup je perd le répertoire et il me renome tout dans le répertoire courant
(par exemple  
toto/tata/titi espace.txt
devient  
titi_expace.txt  
au lieu de  
toto/tata/titi_espace.txt
)
 
ca m'énerve de pas comprend les regexp ! :)
 
Merci!

Reply

Marsh Posté le 29-09-2006 à 21:09:01    

Bof?

Reply

Marsh Posté le 30-09-2006 à 01:57:35    

Bon je reformule ma question :)
comment fait on pour "protéger" une string ?
c'est à dire je veux que  
$toto="blablabla[pouet]_(slupr)";
devienne
$toto="blablabla\[pouet\]_\(slupr\)";
pour pas que mes caracters soient interpretés par mes regexp :)
Merci!

Reply

Marsh Posté le 30-09-2006 à 02:11:35    

Bon, voilà!
suffisait que j'expose clairement mon problème, n'y pense plus pendant une journée, et j'ai trouvé la solution ! (c'est tout couillon en fait comme je le pensais)
Il suffit faire un "quotemeta" sur la chaine !
 
Au final ca me donne ça :
 

Code :
  1. find ./ -print | tac | /usr/bin/myrename.pl '($file) = (m|.+/(.+)|); $file = $_ if (!defined($file));($newfile = $file) =~ s/ /_/g;$file2=quotemeta($file); s/$file2/$1$newfile/;'


 
Merci à vous :)

Reply

Sujets relatifs:

Leave a Replay

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