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 :

Utilisation de la commande sed


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Utilisation de la commande sed
    Bonjour bonjour.
    Ma question va surement paraitre idiote pour beaucoup mais la voici.

    Je dois remplacer dans un fichier tous les caractère ¤ qui ne sont pas compris entre des § par des \¤.
    exemple :
    ab¤cd deviendra ab\¤cd
    ab§¤§cd restera tel quel

    Voici la commande que j'utilise pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed "s/[^§]¤[^§]/\\\¤/g" test.txt
    Seul problème, je perds les anciens caractères (celui d'avant et d'après)
    exemple : ab¤cd devient a\¤d au lieu de ab\¤cd

    Comment faire pour remettre les anciens caractères ?

    Merci d'avance

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Utilise des groupes et desback-references.
    Ton exemple devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/\([^§]\)¤\([^§]\)/\1\\\¤\2/g" test.txt
    (non testé)

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    merci beaucoup pour ton aide, ca marche impec !

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Encore une petite question pour la route alors, vu que t'es chaud

    Comment faire maintenant pour qu'il me remplace les §¤ par des §\¤ et les ¤§ par des \¤§ et tout ca avec une seule ligne sed ?

    parceque pour l'instant il ne les remplace pas a cause des [^§]..[^§]

    Merci d'avance

  5. #5
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Je vois.

    Il suffit donc de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/\\(\\([^§]\\)¤\\(.\\)\\|\\(.\\)¤\\([^§]\\)\\)/\\2\\4\\\\¤\\3\\5/g"
    Comment ça, le code sed n'est pas lisible ? C'est pour ça que des gens ont inventé le quoting et les regexps étendues.
    Ce qui donne après simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/([^§])¤(.)|(.)¤([^§])/\1\3\\¤\2\4/g'
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ cat tmp
    ab¤cd
    ab§¤§cd
    ab¤§cd
    ab§¤cd
    $ sed -r 's/([^§])¤(.)|(.)¤([^§])/\1\3\\¤\2\4/g' < tmp
    ab\¤cd
    ab§¤§cd
    ab\¤§cd
    ab§\¤d
    C'est bien ce que tu voulais ?

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Encore une fois merci . J'aurai du y penser.
    Aller, encore une question pour la route vu que t es le roi des expressions :

    comment on fait quand il y a plus de 9 "paramètres" entre parenthès ?
    c'est a dire que pour le dixième, si je mets \10 il me marque le premier paramètre puis le 0 (du dix). Je sais pas si c'est très clair.

    En fait, j'ai combiné ce traitement avec un autre qui faisait paramètre mais avec d'autre lettres :
    exemple :
    aba --> aba
    abc --> a\bc
    cba --> c\ba
    cbd --> c\bd

    pareil avec les e et f :
    efe --> efe
    efg --> e\fg
    gfe --> g\fe
    gfh --> g\fh

    tu vois le genre

    voici l'expression que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/([^a])(b)(.)|(.)(b)([^a])|([^e])(f)(.)|(.)(f)([^e])/\1\4\7\10\\\2\5\8\11\3\6\9\12/g' test.txt
    Si t y arrives t'es le roi

  7. #7
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    D'autant que je sache, on est limité à 9 avec gnu Sed. Il y a peut-être d'autres versions de Sed qui permettent ça, mais on peut souvent s'en passer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r -e 's/([^a])b(.)|(.)b([^a])/\1\3\\b\2\4/' -e s/([^e])f(.)|(.)f([^e])/\1\3\\f\2\4/'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ cat tmp
    aba
    abc
    cba
    cbd
    efe
    efg
    gfe
    gfh
    $ sed -re 's/([^a])b(.)|(.)b([^a])/\1\3\\b\2\4/' -e 's/([^e])f(.)|(.)f([^e])/\1\3\\f\2\4/' < tmp
    aba
    a\bc
    c\ba
    c\bd
    efe
    e\fg
    g\fe
    g\fh
    $

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Et cette commande va plus vite que deux sed a la suite ou ca n'y change rien ?
    Sinon je préfère le laissé en deux passes séparées

    Encore merci pour ton aide précieux

  9. #9
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Les deux commandes sont exécutées l'une après l'autre, dans la même passe. Le flux est donc lu qu'une seule fois. Niveau rapidité, c'est donc correct (ok, Sed n'est jamais super rapide, mais c'est correct). Je suis presque sûr que cette version en 2 commandes est plus rapide que ta tentative : les regexps séparées sont plus simples à parser.

    Ce sera tout ?

  10. #10
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Re bonjour.

    Juste pour info LLB, j'ai essayé les deux méthodes :
    - 5 traitements avec 5 seds différents
    - 5 traitements en une seule commande sed

    Le résultat est pratiquement identique sur un fichier de plus de 300 mo (même un léger gain de temps avec 5sed)
    J'ai donc gardé cette dernière pour des questions de lisibilité.

    Encore merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de la commande sed avec variable
    Par elfide dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/12/2011, 17h56
  2. utilisation de la commande sed
    Par jeannox69 dans le forum Linux
    Réponses: 3
    Dernier message: 13/02/2011, 19h48
  3. Réponses: 3
    Dernier message: 24/04/2009, 09h12
  4. Utilisation de la commande SED.
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 02/05/2008, 14h52
  5. Utilisation de la commande sed
    Par nizniz dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 04/10/2006, 21h03

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