Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 08/06/2009, 19h42   #1
Invité de passage
 
Inscription : juin 2009
Messages : 1
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 1
Points : 0
Points : 0
Par défaut Opérations sur chaines dans un fichier

Bonjour,
J'ai un fichier 1 où j'ai par exemple: mot1 mot2 mot3
Je souhaite faire un traitement sur un fichier 2 où je souhaite:
- remplacer mot1 par UnAutreMot dans la chaine: "salut... mot1 ... toto"
- supprimer les lignes qui contiennent: "bonjour... mot2... au revoir" et "bonjour... mot3... coucou"
les chaines entourant mot2 et mot3 peuvent etre differentes.
Avez-vous une idée de comment le faire? j'ai essayé d'utiliser awk ou sed mais j'ai pas su comment !

Voici un exemple:

fichier AVANT:
salut... mot1 ... toto
bonjour... mot2... au revoir
bonjour... mot3... coucou"

fichier APRES:
salut... UnAutreMot ... toto


mot1, mot2 et mot3 doivent etre lus d'un autre fichier

Merci pour votre aide
medo67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2009, 11h48   #2
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 856
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 856
Points : 1 616
Points : 1 616
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Mmmh, j'ai compris que tu voulais :

1. partir d'un fichier fic1 contenant 3 mots séparés par un espace (mot1, mot2 et mot3)
2. modifier un fichier fic2 dans lequel :
2.1. toute occurrence de mot1 est remplacée par UnAutreMot
2.2. toute ligne comportant mot2 est supprimée
2.3. toute ligne comportant mot3 est supprimée

Si j'ai bon, et que tu veux le faire en une seule commande, alors tu peux bricoler un truc du style :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat motcle
mot1 mot2 mot3
$ cat test
salut... mot1 ... toto
bonjour... mot2... au revoir
mot1 ... salut ... toto
bonjour... mot3... coucou
salut... mot1 ... toto ... mot2
salut... ... toto
$ sed 's/'`cut -d' ' -f1 motcle`'/UnAutreMot/;/'`cut -d' ' -f2 motcle`'/d;/'`cut -d' ' -f3 motcle`'/d' test
salut... UnAutreMot ... toto
UnAutreMot ... salut ... toto
salut... ... toto
Y'a peut-être plus propre

Explications (si besoin ?):

1. une commande sed :
Code :
sed 's/'`cut -d' ' -f1 motcle`'/UnAutreMot/g;/'`cut -d' ' -f2 motcle`'/d;/'`cut -d' ' -f3 motcle`'/d' test
2. dans cette commande, 3 opérations séparées par des points-virgules :
Code :
s/'`cut -d' ' -f1 motcle`'/UnAutreMot/g;/'`cut -d' ' -f2 motcle`'/d;/'`cut -d' ' -f3 motcle`'/d
2.1. première commande: remplacer les occurrences du premier mot du fichier :
Code :
1
2
3
s/'                            > s/x/y/g => remplace (s) toutes (g) les occurrences du motif x par le motif y
`cut -d' ' -f1 motcle`         > coupe le premier champ (-f1) du fichier motcle en utilisant l'espace comme séparateur (-d' ') : motif à remplacer
'/UnAutreMot/g                 > motif remplaçant le précédent
2.3. deuxième et troisième commande sont similaires: supprimer les lignes comportant un mot particulier :
Code :
1
2
3
/'                             > /x/d => supprime (d) les lignes comportant le motif x
`cut -d' ' -f2 motcle`         > idem que 2.1. sauf qu'on prend le second champ (-f2) : motif identifiant les lignes à supprimer
'/d                            > indique qu'on veut supprimer la ligne
les ' sont là pour encadrer la commande sed, mais il faut aussi les intercaler entre les commandes entourées de `...`
`...` permet d'utiliser une commande dans une autre, ici, ces commandes récupèrent chaque mot de ton premier fichier pour l'isoler.

Bien sur, la même chose serait possible en plus lisible avec un script: commencer par récupérer la liste de mots dans des variables avec cut ou awk ou autre, puis faire la commande sed avec ces variables, ce qui est plus facile à lire !

Sinon, tu peux aussi le faire assez simplement en Perl...

Dernière modification par Alek-C ; 12/06/2009 à 12h47.
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 12h39.


 
 
 
 
Partenaires

Hébergement Web