IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unix Discussion :

Opérations sur chaines dans un fichier


Sujet :

Unix

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Points : 1
    Points
    1
    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

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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électionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/04/2006, 09h33
  2. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  3. enregistrer une liste chainée dans un fichier?
    Par ALF-Teams dans le forum C
    Réponses: 7
    Dernier message: 08/03/2006, 18h42
  4. Réponses: 21
    Dernier message: 29/09/2005, 19h33
  5. [Stratégie]Sauvegarde d'une liste chainée dans un fichier
    Par BernardT dans le forum Général Java
    Réponses: 17
    Dernier message: 25/07/2005, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo