|
|
|
|
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.:)
Configuration: Windows XP Firefox 2.0
Salut,
perl -pi.orig -e 's/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/' data.txtou perl -pi.orig -e 's/\|\|/|C|/' data.txtou perl -pi.orig -e 's/(?<=\|)(?=\|)/C/' data.txtSous 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| lami20j |
Et avec le script
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|
lami20j |