[Perl] Remplacer Nieme occurence fichier plat
Résolu
Goten
-
Goten -
Goten -
Bonjour,
Comment remplacer dans un fichier de ce type:
toto|tata|titi||toutou|tonton|
popo|papa|pipi||poupou|ponpon|
Apres la 3ieme occurences de | par une valeur constante disons C?
Merci pour votre aide...Vous aurez compris c'est pour redresser un fichier plat.:)
Comment remplacer dans un fichier de ce type:
toto|tata|titi||toutou|tonton|
popo|papa|pipi||poupou|ponpon|
Apres la 3ieme occurences de | par une valeur constante disons C?
Merci pour votre aide...Vous aurez compris c'est pour redresser un fichier plat.:)
Configuration: Windows XP Firefox 2.0
5 réponses
-
J'essaie un truc comme ça mais ça change rien :)
#!/usr/bin/perl
open(FICH, "data.txt");
while (<FICH>) {
if ( (index($_,"|") eq 3) ) {
$_ =~ s/|/C|/;
}
print "$_";
}
close(FICH); -
tu veux changer le 3ème | ou le caracactère après le 3ème | ?!
je vois que en fait le 3ème | et suis toute suite du 4ème
donc affiche c'est que tu veux obtenir comme résultat pour pouvoir t'aider
-
Salut,
je n'ai pas testé
En ligne de commande (modification directe avec sauvegarde de fichier original - data.txt original deviendra data.txt.orig)perl -pi.orig -e 's/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/' data.txt
ouperl -pi.orig -e 's/\|\|/|C|/' data.txt
ouperl -pi.orig -e 's/(?<=\|)(?=\|)/C/' data.txt
Sous forme de script (la modification sera écrite dans un autre fichier)#!/usr/bin/perl open LIRE,"data.txt" or die "E/S : $!\n"; open ECRIRE, ">> date_res.txt" or die "E/S : $!\n"; while (<LIRE>){ s/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/; # je vérifie les 3 premiers | print ECRIRE; } close LIRE; close ECRIRE; __END__ou#!/usr/bin/perl open LIRE,"data.txt" or die "E/S : $!\n"; open ECRIRE, ">> date_res.txt" or die "E/S : $!\n"; while (<LIRE>){ s/\|\|/|C|/;# j'ai remarqué un seul regroupement # s'il y a plusieurs on ne risque rien # seulement le 1er rencontré sera modifié print ECRIRE; } close LIRE; close ECRIRE; __END__ou#!/usr/bin/perl open LIRE,"data.txt" or die "E/S : $!\n"; open ECRIRE, ">> date_res.txt" or die "E/S : $!\n"; while (<LIRE>){ s/(?<=\|)(?=\|)/C/; # pareil comme la version 2 sauf que j'utilise les tests avant/arrière print ECRIRE; } close LIRE; close ECRIRE; __END__--
lami20j -
Voilà le test avec la ligne de commande
$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| $ perl -pi.orig -e 's/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/' data.txt $ cat data.txt toto|tata|titi|C|toutou|tonton| popo|papa|pipi|C|poupou|ponpon| $ mv data.txt.orig data.txt $ perl -pi.orig -e 's/\|\|/|C|/' data.txt $ cat data.txt toto|tata|titi|C|toutou|tonton| popo|papa|pipi|C|poupou|ponpon| $ mv data.txt.orig data.txt $ perl -pi.orig -e 's/(?<=\|)(?=\|)/C/' data.txt $ cat data.txt toto|tata|titi|C|toutou|tonton| popo|papa|pipi|C|poupou|ponpon|
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
et avec le script
1.lami20j@debian:~/trash$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl open LIRE,"data.txt" or die "E/S : $!\n"; open ECRIRE, ">> date_res.txt" or die "E/S : $!\n"; while (<LIRE>){ s/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/; # je vérifie les 3 premiers | print ECRIRE; } close LIRE; close ECRIRE; __END__ lami20j@debian:~/trash$ perl ccm.pl lami20j@debian:~/trash$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| lami20j@debian:~/trash$ cat date_res.txt toto|tata|titi|C|toutou|tonton| popo|papa|pipi|C|poupou|ponpon|
2.lami20j@debian:~/trash$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl open LIRE,"data.txt" or die "E/S : $!\n"; open ECRIRE, ">> date_res.txt" or die "E/S : $!\n"; while (<LIRE>){ s/\|\|/|C|/;# j'ai remarqué un seul regroupement # s'il y a plusieurs on ne risque rien # seulement le 1er rencontré sera modifié print ECRIRE; } close LIRE; close ECRIRE; __END__ lami20j@debian:~/trash$ perl ccm.pl lami20j@debian:~/trash$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| lami20j@debian:~/trash$ cat date_res.txt toto|tata|titi|C|toutou|tonton| popo|papa|pipi|C|poupou|ponpon|3.lami20j@debian:~/trash$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl open LIRE,"data.txt" or die "E/S : $!\n"; open ECRIRE, ">> date_res.txt" or die "E/S : $!\n"; while (<LIRE>){ s/(?<=\|)(?=\|)/C/; # pareil comme la version 2 #sauf que j'utilise les tests avant/arrière print ECRIRE; } close LIRE; close ECRIRE; __END__ lami20j@debian:~/trash$ perl ccm.pl lami20j@debian:~/trash$ cat data.txt toto|tata|titi||toutou|tonton| popo|papa|pipi||poupou|ponpon| lami20j@debian:~/trash$ cat date_res.txt toto|tata|titi|C|toutou|tonton| popo|papa|pipi|C|poupou|ponpon|