if [ $chaine1 != $chaine2 ]; then
echo "Chaines différentes"
fi
sed s/(.*)(toto)(.*)/(TOTO)\2(TOTO)/g
#/usr/bin/env perl
# Test des arguments passés à l'appel
if ($#ARGV != 3) {
print "Argument manquant!\n";
print("Syntaxe : ./$0 <chaine_a_conserver> <chaine_de_remplacement> <fichier_entree> <fichier_sortie>\n");
exit(1);
}
# Récupération des arguments
$keep_string = @ARGV[0];
$chg_string = @ARGV[1];
$infile = @ARGV[2];
$outfile = @ARGV[3];
# Ouverture des fichiers d'entrée et de sortie
open(INF, "$infile") or die "Impossible d'ouvrir le fichier $infile";
open(OUTF, ">$outfile") or die "Impossible de créer le fichier $outfile";
# Boucle de lecture du fichier ligne à ligne
while (<INF>) {
# Récupère chaque mot dans le tableau @words
my @words = split(/ /, $_);
my $new_string = "";
# Remplace tous les mots qui ne sont pas egaux à $keep_string
foreach(@words) {
if ($_ ne $keep_string) {
$new_string .= $chg_string . ' ';
} else {
$new_string .= $_ . ' ';
}
}
# Ecrit la chaine transformée dans le fichier de sortie
syswrite(OUTF, $new_string . "\n");
}
# Fermeture des fichiers et fin
close(INF) and close(OUTF);
chmod 755 replace.pl
replace.pl <chaine_a_conserver> <chaine_a_remplacer> <fichier_entree> <fichier_sortie>
Je ne comprends pas ce que tu veux dire. Cette ligne sert juste à afficher une aide sur la manière dont on utilise le script. Si c'est pour le \n à la fin, il n'est pas obligatoire. Il sert juste à faire un saut de ligne.obiwan67 a dit:heu pour cette ligne c'est ça ?
print("syntaxe : ./$0 <chaine_a_conserver> <chaine_de_remplacement> <fichier_entree> <fichier_sortie>")
OK je comprends mieux. j'ai mis les arguments entre <> mais il ne faut pas les utiliser. C'est une convention de notation quand on décrit la manière d'appeler un programme en ligne de commande, cela permet de repérer les arguments obligatoire et/ou optionnels. J'aurais pu les mettre entre [] ou entre (). En gros, voici un exemple :obiwan67 a dit:et pour la chaine a comparer je voudrais comparer sur une parti de la chaine seulement
est ce que cela fonctionnerait
<chaine_a_conserver>
<hit: .*: ^7-^4V^7P^1C^7- .* hit>
my @words = split(/ /, $_);
, supposons que ton délimiteur soit le caractère -, tu définiras le premier argument de split() par:obiwan67 a dit:hit: .*: ^7-^4V^7P^1C^7- .* hit
my @words = split(/-/, $_);
my @words = split(/\^/, $_);
my @words = split(/"t:"C/, $_);
oui ca j'avais capté mais la ligne dont on parle est comme ça sur ta copie d'écranLeehalt a dit:Je pense que ce topic mériterait maintenant d'être déplacé dans le forum "Programmation"...
Je ne comprends pas ce que tu veux dire. Cette ligne sert juste à afficher une aide sur la manière dont on utilise le script. Si c'est pour le \n à la fin, il n'est pas obligatoire. Il sert juste à faire un saut de ligne.
(/"t:"C/, $_) ou (/"t:""C"/, $_) ?OK je comprends mieux. j'ai mis les arguments entre <> mais il ne faut pas les utiliser. C'est une convention de notation quand on décrit la manière d'appeler un programme en ligne de commande, cela permet de repérer les arguments obligatoire et/ou optionnels. J'aurais pu les mettre entre [] ou entre (). En gros, voici un exemple :
replace.pl Gardez-moi virez-les donnees.txt resultat.txt
De la manière dont est écrit le script, il travaille sur les éléments du fichier qui se situent entre deux caractères "espace". C'est la ligne suivante qui fait la séparation:
Tu remarqueras que le premier argument de la fonction split est une expression régulière comme celles que tu as l'habitude d'utiliser avec sed. Il s'agit de / / (l'espace entre les 2 slashes est important!) qui reconnait tous les espaces dans un texte. split() va donc récupérer tous les éléments séparés par des espaces et les stocker dans le tableau @word, et ce pour chaque ligne du fichier (stockée dans la variable spéciale $_).Bloc de code:my @words = split(/ /, $_);
Mais tu peux modifier le script pour préciser les délimiteurs afin de faire des recherches sur des parties de chaine. Dans ton cas , supposons que ton délimiteur soit le caractère -, tu définiras le premier argument de split() par:. Si ton délimiteur est ^, alors tu écrirasBloc de code:my @words = split(/-/, $_);
Le backslash \ est nécessaire devant ^ car ^ est un caractère spécial des expressions régulières qui désigne le début d'une ligne. Et pour lui faire perdre son sens spécial on met un \ devant.Bloc de code:my @words = split(/\^/, $_);
Tu peux aussi définir plusieurs délimiteurs. Par exemple pour retourner les sous-chaines comprises entre les caractères t: et ^, tu écrirasBloc de code:my @words = split(/"t:"C/, $_);
. Tout le jeu pour toi consiste donc à trouver les délimiteurs qui t'intéressent, qui peuvent être des caractères, des bouts de chaines (à mettre entre "" (à confirmer, je ne suis plus sur)) et des caractères non imprimables (comme le saut de ligne \n, la tabulation \t, etc. Ah le backslash est \\ of course
Bon j'ai fait une erreur (normal, vu la taille de mon poste), vu que dans mon exemple je prends comme délimiteurs t: et ^ l'expression régulière est /"t:"\^/.obiwan67 a dit:(/"t:"C/, $_) ou (/"t:""C"/, $_) ?
La longueur de la chaine n'est pas un pb grâce aux expressions régulières. T'as qu'à utiliser /"hit"/ comme expression régulière. Tu peux aussi essayer /"hit":?/, qui devrais trouver hit et hit: (normalement )obiwan67 a dit:mes delimiteurs sont dans ce cas "hit:" et " hit"
en fait le gros souci que j'ai c'est que ce qui est en rouge n'est jamais pareil et je ne connais même pas la longueur de la chaine car elle est variable
hit: .*: ^7-^4V^7P^1C^7- .* hit
la syntaxe est elle juste comme ça ?