gilou Modérateur Modzilla | C'est très probablement faisable en sed, mais ça demande un niveau d'expertise que j'ai eu il y a bien longtemps, mais que je n'ai plus depuis que j'utilise perl, parce que ça doit être assez complexe à écrire en sed et plus simple en perl. En perl je procéderais ainsi: s/(a+)/{my $tmp = substr($1, 1); $tmp =~ tr!a!b!; $tmp}/eg; On cherche le pattern a+, quand trouvé, on évalue (le e de /eg) {my $tmp = substr($1, 1); $tmp =~ tr!a!b!; $tmp}: On récupère la sous chaine matchant le pattern (donc avec au moins un a) commençant au 2e caractère, donc ca fait la chaine avec un a de moins, on remplace les a par des b dans cette sous chaine, et enfin on renvoie la chaine (comme on est dans un eval, pas besoin de return...) C'est donc le résultat de cette évaluation qui est substitué. Testé ainsi:
Code :
#!/usr/local/bin/perl use strict; use warnings; my $x = "Biaaall the bad caaaaaat"; $x =~ s/ (a+ )/ {my $tmp = substr($ 1, 1); $tmp =~ tr!a!b!; $tmp}/eg;
|
>perl test.pl >Bibbll the bd cbbbbbt Bon ensuite l'intérêt, c'est qu'on peut en faire une procédure, plus modulaire et réemployable:
Code :
#!/usr/local/bin/perl use strict; use warnings; # powersubst(chaine, caractere a remplacer, caractere de remplacement, décalage) #remplace le caractère a remplacer par le caractère de remplacement # si décalage est positif n'est pas nul on remplace n occurences initiales # du caractère a remplacer par n + décalage occurences du caractère de remplacement # ou rien si n + décalage n'est pas positif sub powersubst { my ($_, $cin, $cout, $decal) = @_; if ((not defined($decal)) or (not $decal)) { } else { if ($decal < 0) { s/ ($cin+ )/ {my $tmp = substr($ 1, 0, $decal); $tmp =~ s! $cin! $cout!g; $tmp}/eg; } if ($decal > 0) { s/ ($cin+ )/ {my $tmp = $ 1. ("$cout" x $decal); $tmp =~ s! $cin! $cout!g; $tmp}/eg; } } } my $x = "Biaaall the bad caaaaaat"; print powersubst ($x, "a", "x", 3), "\n\n"; print powersubst ($x, "a", "y", 0), "\n\n"; print powersubst ($x, "a", "z", -2), "\n\n"; print powersubst ($x, "a", "s" ), "\n";
|
>perl test.pl >Bixxxxxxll the bxxxxd cxxxx > >Biyyyll the byd cyyyyyyt > >Bizll the bd czzzzt > >Bisssll the bsd csssssst A+, Message édité par gilou le 10-02-2011 à 13:25:06 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|