[scripts unix] - gestion fichiers
Fermé
david_m
Messages postés
2
Date d'inscription
mercredi 14 décembre 2005
Statut
Membre
Dernière intervention
15 décembre 2005
-
14 déc. 2005 à 18:37
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 15 déc. 2005 à 19:22
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 15 déc. 2005 à 19:22
A voir également:
- [scripts unix] - gestion fichiers
- Wetransfer gratuit fichiers lourd - Guide
- Gestion de fichiers - Télécharger - Gestion de fichiers
- Renommer plusieurs fichiers en même temps - Guide
- Logiciel gestion photo gratuit - Guide
- Explorateur de fichiers - Guide
3 réponses
mamiemando
Messages postés
33459
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 janvier 2025
7 813
15 déc. 2005 à 01:33
15 déc. 2005 à 01:33
Moi je ferais un petit script en python ou en perl, en utilisant des expressions régulières. Je te suggère de regarder un petit tutorial sur google pour voir comment tout ça marche.
Bonne chance
Bonne chance
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
15 déc. 2005 à 04:56
15 déc. 2005 à 04:56
Salut,
Voilà un petit exemple.
Le fichier 1 je ne le modifie pas, je l'utilise seulement pour lire les données, ensuite je compare avec les données du fichier 2. Le résultat est écrit dans le fichier 3.
Je n'ai pas testé tous le possibilité (texte n'importe quel contenu c'est un peu vaste). C'est vrai que les expressions régulières sont puissantes, mais il faut savoir la structure de texte à traiter.
Le script et un example
Fichier 1. Données lues
Fichir 2 - valeurs à comparer
Fichier 3 - les blocs dont les valeurs correspondent sont écrits
Voilà un petit exemple.
Le fichier 1 je ne le modifie pas, je l'utilise seulement pour lire les données, ensuite je compare avec les données du fichier 2. Le résultat est écrit dans le fichier 3.
Je n'ai pas testé tous le possibilité (texte n'importe quel contenu c'est un peu vaste). C'est vrai que les expressions régulières sont puissantes, mais il faut savoir la structure de texte à traiter.
Le script et un example
#! /usr/bin/perl -w use strict; $/="\n\n\n"; # à cause des sautes de ligne que j'ai ajouté avant VALEUR # s'il n'y a pas de saute de ligne avant VALEUR $/="" suffit my @vec; my @valeur; open FVALEUR,"/home/lamitest/david_m1.txt" ; my $ligne=<FVALEUR>; $ligne =~ s/valeur\n/:valeur/ig; $ligne =~ s/{\n/{/g; $ligne =~ s/\n}/}:/g; my @ligne= split /:/, $ligne; close FVALEUR; open FCOMPARE,"/home/lamitest/david_m2.txt" or die "Impossible d'ouvrir le fichier : $!\n"; while (my $val = <FCOMPARE>){ chomp($val); push @valeur,$val; } close FCOMPARE; foreach my $x(@ligne){ if ($x!~/valeur{(\d+)}/i){ push (@vec,$x); }elsif ($x=~/(valeur{(\d+)})/i){ push @vec,"\U$1" if (grep /$2/,@valeur); } } open FECRIRE,"> /home/lamitest/david_m_res.txt" or die "Impossible de créer le fichier : $!"; foreach(@vec){ s/valeur/\Uvaleur\n/i; s/{/{\n/; s/}/\n}/; print FECRIRE; } close FECRIRE;
Fichier 1. Données lues
[lamitest@localhost ~]$ cat david_m1.txt Le ficier N°1 ou se trouve des données et du texte Dans le fichier n°2 les chiffre : 250 et 22 textepeuimportelecontenu1 ligne 1 Ce bloc doit rester VALEUR { 250 } ligne2 textepeuimportelecontenu2 VALEUR { 137 } bla bbla textepeuimportelecontenu2 textepeuimportelecontenu1 Ce bloc doit rester VALEUR { 22 } textepeuimportelecontenu2 texte à ajouter VALEUR { 10257 } textepeuimportelecontenu2 [lamitest@localhost ~]$
Fichir 2 - valeurs à comparer
[lamitest@localhost ~]$ cat david_m2.txt 22 250 30 [lamitest@localhost ~]$
Fichier 3 - les blocs dont les valeurs correspondent sont écrits
[lamitest@localhost ~]$ cat david_m_res.txt Le ficier N°1 ou se trouve des données et du texte Dans le fichier n°2 les chiffre 250 et 22 textepeuimportelecontenu1 ligne 1 Ce bloc doit rester VALEUR { 250 } ligne2 textepeuimportelecontenu2 bla bbla textepeuimportelecontenu2 textepeuimportelecontenu1 Ce bloc doit rester VALEUR { 22 } textepeuimportelecontenu2 texte à ajouter textepeuimportelecontenu2 [lamitest@localhost ~]$
david_m
Messages postés
2
Date d'inscription
mercredi 14 décembre 2005
Statut
Membre
Dernière intervention
15 décembre 2005
15 déc. 2005 à 10:53
15 déc. 2005 à 10:53
d'abord merci pour ton aide.
Quand je dis textenimportequelcontenu, c'est vraiment que cela peut-être n'importe quoi. En lisant (décryptant...) le script, il me semble que j'ai omis de dire une chose:
Dans textenimportequelcontenu, il peut y avoir
VALEUR2
{
valx
}
Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.
En tout cas je continue ...
Quand je dis textenimportequelcontenu, c'est vraiment que cela peut-être n'importe quoi. En lisant (décryptant...) le script, il me semble que j'ai omis de dire une chose:
Dans textenimportequelcontenu, il peut y avoir
VALEUR2
{
valx
}
Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.
En tout cas je continue ...
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
david_m
Messages postés
2
Date d'inscription
mercredi 14 décembre 2005
Statut
Membre
Dernière intervention
15 décembre 2005
15 déc. 2005 à 19:12
15 déc. 2005 à 19:12
Salut,
Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.
Pas tout à fait. Le traitement et fait par rapport au
VALEUR
{
val
}
Un VALEUR2 ne me dérange pas du tout. Mais en ce cas si tu fait une copie coller d'une partie de ton fichier pour voir la structure, je n'aurai qu'à faire quelques petites modifications.
Je vais insérer aussi des commentaires pour comprendre exactement comme il fonctionne.
Par exemple:
$ligne avale le fichier entier.
Ensuite je remplace VALEUR\n avec :VALEUR pour pouvoir faire split par rapport aux :
Si tu as VALEURn (n un numéro quelconque) on peut faire ça
En ce cas ? reconnaît ou pas une chiffre ou plusieurs.
? quantificateur optionnel
* rien ou une chiffre,2chiffre,...........
En ce cas est reconnu VALEUR, VALEUR2, VALEUR222,.....
C'est bien de savoir si tu as toujours
VALEURn
{
val
}
Voilà la modification
===============================================
Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.
Pas tout à fait. Le traitement et fait par rapport au
VALEUR
{
val
}
Un VALEUR2 ne me dérange pas du tout. Mais en ce cas si tu fait une copie coller d'une partie de ton fichier pour voir la structure, je n'aurai qu'à faire quelques petites modifications.
Je vais insérer aussi des commentaires pour comprendre exactement comme il fonctionne.
Par exemple:
open FVALEUR,"/home/lamitest/david_m1.txt" ; my $ligne=<FVALEUR>; $ligne =~ s/valeur\n/:valeur/ig; $ligne =~ s/{\n/{/g; $ligne =~ s/\n}/}:/g; my @ligne= split /:/, $ligne; close FVALEUR;
$ligne avale le fichier entier.
Ensuite je remplace VALEUR\n avec :VALEUR pour pouvoir faire split par rapport aux :
Si tu as VALEURn (n un numéro quelconque) on peut faire ça
$ligne =~ s/valeur(d*)?\n/:valeur$1/ig;
En ce cas ? reconnaît ou pas une chiffre ou plusieurs.
? quantificateur optionnel
* rien ou une chiffre,2chiffre,...........
En ce cas est reconnu VALEUR, VALEUR2, VALEUR222,.....
C'est bien de savoir si tu as toujours
VALEURn
{
val
}
Voilà la modification
===============================================
$/=""; my @vec; my @valeur; open FVALEUR,"/home/lamitest/david_m1.txt" ; my $ligne=<FVALEUR>; $ligne =~ s/valeur(\d*)?\n/:valeur$1/ig;# reconnaît VALEUR,VALEUR1,VALEUR22,.. $ligne =~ s/{\n/{/g; $ligne =~ s/\n}/}:/g; my @ligne= split /:/, $ligne; close FVALEUR; open FCOMPARE,"/home/lamitest/david_m2.txt" or die "Impossible d'ouvrir le fichier : $!\n"; while (my $val = <FCOMPARE>){ chomp($val); push @valeur,$val; } close FCOMPARE; foreach my $x(@ligne){ if ($x!~/valeur(\d*)?{(\d+)}/i){ push (@vec,$x); }elsif ($x=~/(valeur(?:\d*)?{(\d+)})/i){ push @vec,"\U$1" if (grep /$2/,@valeur); } } open FECRIRE,"> /home/lamitest/david_m_res.txt" or die "Impossible de créer le fichier : $!"; foreach(@vec){ s/valeur(\d*)?/\Uvaleur$1\n/i; s/{/{\n/; s/}/\n}/; print FECRIRE; } close FECRIRE;
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
15 déc. 2005 à 19:22
15 déc. 2005 à 19:22
Exemple:
Fichier1
Fichier 2
Résultat
Fichier1
[lamitest@localhost ~]$ cat david_m1.txt Le ficier N°1 ou se trouve des données et du texte Dans le fichier n°2 les chiffre : 250 et 22 textepeuimportelecontenu1 ligne 1 Ce bloc doit rester VALEUR { 250 } ligne2 textepeuimportelecontenu2 VALEUR { 137 } bla bbla textepeuimportelecontenu2 textepeuimportelecontenu1 Ce bloc doit rester VALEUR2 { 22 } textepeuimportelecontenu2 texte à ajouter VALEUR { 10257 } textepeuimportelecontenu2 [lamitest@localhost ~]$
Fichier 2
[lamitest@localhost ~]$ cat david_m2.txt 22 250 30 [lamitest@localhost ~]$
Résultat
[lamitest@localhost ~]$ cat david_m_res.txt Le ficier N°1 ou se trouve des données et du texte Dans le fichier n°2 les chiffre 250 et 22 textepeuimportelecontenu1 ligne 1 Ce bloc doit rester VALEUR { 250 } ligne2 textepeuimportelecontenu2 bla bbla textepeuimportelecontenu2 textepeuimportelecontenu1 Ce bloc doit rester VALEUR2 { 22 } textepeuimportelecontenu2 texte à ajouter textepeuimportelecontenu2 [lamitest@localhost ~]$