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

Shell et commandes GNU Discussion :

Parcourir les motifs dans un fichier A et les supprimer dans le fichier B


Sujet :

Shell et commandes GNU

  1. #21
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s/toto/tata/g
    s/tata/titi/g
    (...) l'ordre est important (...)
    au pire on peut ruser un peu pour palier au problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /toto/{s/toto/tata/g;n}
    /tata/{s/tata/titi/g;n}

  2. #22
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Non, ça ne fonctionne pas avec toto titi tata:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo toto titi tata | sed '/toto/{s/toto/tata/g;n};/tata/{s/tata/titi/g;n}'
    tata titi tata
    PS: sinon /toto/{s/toto/tata/g;n} est simplifiable en s/toto/tata/g;t
    Cordialement.

  3. #23
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Pour contourner le problème soulevé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paste -d "/" valeurdepart valeurarrive | { sed -e 's:.:&\\n:g;:b;s:\\n\(.*/\):\1:;tb;s:.*:s/&/g:' ; echo 's/\n//g' ; } | sed -f - fichier_a_traiter
    Ici, un mot remplacer par une regex ne sera pas remplacé par une autre regex...
    Cordialement.

  4. #24
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    Par défaut
    impressionnante ta commande disedorgue elle est très puissante.
    J'essaie de la décortiquer pour bien comprendre mais je suis dépassé, peux-tu me donner une explication?
    Encore merci et c'est vraiment impressionnant la puissance de cet outil

    Bien cordialement

  5. #25
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Laquelle veux-tu que j'explique et qu'est-ce que tu ne comprends pas ?
    Cordialement.

  6. #26
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    Par défaut
    Salut,

    c'est la commande sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's:.:&\\n:g;:b;s:\\n\(.*/\):\1:;tb;s:.*:s/&/g:'
    je suis bien évidemment allé chercher la signification des différentes options que je ne connaissais pas mais je n'arrive pas à la décomposer et bien comprendre les différentes étapes de cette commande.
    Les : servent à remplacer le / ? Je suis un peu perdu.

    Merci

  7. #27
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Oui, les ':' remplace bien les '/' ici. Si on décompose le sed, ça se présente comme ceci:
    1) s:.:&\\n:g ici à chaque caractère de la ligne on lui rajoute la chaine '\n' que le deuxième sed interprètera comme étant le newline.
    2a) :b ici on déclare une référence (ou point d'ancrage) que l'on appelle 'b'.
    2b) s:\\n\(.*/\):\1: ici on retire la première chaine '\n' rencontré dans la chaine à gauche du '/'.
    2c) tb on retourne à la référence 'b' si la dernière commande de substitution (donc ici, la ligne juste au dessus) à bien fait un replace.
    3) s:.*:s/&/g: ici, on fabrique la commande de substitution pour le 2éme sed.

    Et donc, si on décompose par exemple avec la ligne:
    1) transformera la ligne en la chaine t\no\nt\no\n/\nt\ni\nt\ni\n .
    2a,2b,2c) transformeront au finale la chaine en toto/\nt\ni\nt\ni\n .
    3) transformera la chaine en s/toto/\nt\ni\nt\ni\n/g qui sera donné au second sed en tant que commande.

    Pour le second sed, c'est comme si on lui avait fourni un fichier de commande qui contient la commande s/toto/\nt\ni\nt\ni\n/g et la commande venant du echo 's/\n//g' à exécuter sur le fichier à traiter.
    Le s/\n//g est la pour supprimer tous les '\n' que l'on avait rajouté et pas encore supprimé.
    Il faut savoir qu'en sed, le newline ( '\n' ) est le seul caractère que l'on ne rencontrera pas lors de la lecture d'une ligne puisque c'est lui qui marque la fin d'une ligne.
    Cordialement.

  8. #28
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup diserdogue pour cette explication, je n'y connais pas grand chose mais c'est vraiment une approche ingénieuse de mon problème.
    Encore merci et sûrement à une prochaine
    Cordialement

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/11/2016, 20h16
  2. Supprimer n lignes d'un fichier.txt et les renvoyer dans un autre fichier
    Par supcomingenieur dans le forum Shell et commandes GNU
    Réponses: 64
    Dernier message: 30/04/2013, 13h59
  3. Réponses: 4
    Dernier message: 06/06/2011, 21h05
  4. Réponses: 5
    Dernier message: 21/02/2007, 16h12
  5. Réponses: 1
    Dernier message: 05/09/2006, 17h56

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