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 :

Expressions régulières avec SED


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut Expressions régulières avec SED
    Bonjour a tous,

    j'ai ce fichier:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <controlfield tag="001">   a0000019</controlfield>
    <controlfield tag="001">   a0000020</controlfield>
    <controlfield tag="001">   a0000021</controlfield>
    Et je voudrais enlever les espaces entre le 001"> et le a
    A la final j'aurais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <controlfield tag="001">0000019</controlfield>
    <controlfield tag="001">0000020</controlfield>
    <controlfield tag="001">0000021</controlfield>
    Je pense qu'avec un find replace je devrais pouvoir le faire, mais je voudrais apprendre a utiliser sed, donc j'ai testé ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/^[tag=\"001\">   a]/s/tag=\"001\">'/ fichier.txt
    Mais ça marcha pas, j'ai une erreur 's

    Apres cet exercice je voudrais faire ceci:
    J'ai ce fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <subfield code="9">0004242</subfield>
    <subfield code="9">0000067</subfield>
    <subfield code="9">0014242</subfield>
    Je voudrais enlever les 0 donc ça ferait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <subfield code="9">4242</subfield>
    <subfield code="9">67</subfield>
    <subfield code="9">14242</subfield>
    Alors avec sed toujours, je ne trouve pas le moyen de lui dire, pour chaque code="9"> enlever tous les 0 jusqu'au premier caracter different de 0.

    Un petit coup de pouce serait cool.
    Merci a tous.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat plop 
    <controlfield tag="001">   a0000019</controlfield>
    <controlfield tag="001">   a0000020</controlfield>
    <controlfield tag="001">   a0000021</controlfield>
     
    <subfield code="9">0004242</subfield>
    <subfield code="9">0000067</subfield>
    <subfield code="9">0014242</subfield>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed '/tag="001"/ s/>  *a/>/;/code="9"/ s/00*//' plop 
    <controlfield tag="001">0000019</controlfield>
    <controlfield tag="001">0000020</controlfield>
    <controlfield tag="001">0000021</controlfield>
     
    <subfield code="9">4242</subfield>
    <subfield code="9">67</subfield>
    <subfield code="9">14242</subfield>
     
    $

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut

    whaaa cool
    alors si je comprend bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/tag="001"/ s/>  *a/>/;/code="9"/ s/00*//'
    le ; au centre sert a separer 2 commandes sed dans une seule ligne.
    la premiere commande ok le s pour substitute.

    le * devant le a c'est pour si jamais y'a plusieurs espaces en blanc avant le a?
    ensuite le 00*// alors la je comprend pas...

    Si j'ai ça par exemple, ça marchera pareil?
    tag="001">0000001<
    avec tous ces zero?

    D'avance merci

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    le ; au centre sert a separer 2 commandes sed dans une seule ligne.
    Exactement.

    le * devant le a c'est pour si jamais y'a plusieurs espaces en blanc avant le a?
    ensuite le 00*// alors la je comprend pas...
    En fait l'astérisque n'est pas devant le "a" mais plutôt derrière l'espace (et même deux espace pour être exact). L'astérisque est un quantificateur, il signifie, zéro, un ou plusieurs occurrence(s) du caractère le précédent. Dans notre cas on cible donc au moins un espace (le 1er), suivi d'aucun, d'un ou plusieurs espace(s).
    Et c'est la même chose pour les 0 (zéros). On cible au moins un zéro (le 1er), suivi d'aucun, d'un ou plusieurs zéro(s).



    Si j'ai ça par exemple, ça marchera pareil?
    tag="001">0000001<
    avec tous ces zero?
    Oui, mais il faudra bien cibler les zéros qui suivent le chevron (>), sans quoi ceux du tag subiront le même effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ echo 'tag="001">0000001<' | sed 's/00*//'
    tag="1">0000001<
     
    $ echo 'tag="001">0000001<' | sed 's/00*//g'
    tag="1">1<
     
    $ echo 'tag="001">0000001<' | sed 's/>00*/>/'
    tag="001">1<
     
    $ echo 'tag="001">0000001<' | sed 's/00*//2'
    tag="001">1<
     
    $

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Super, je crois que j'ai compris, je vais faire des essais pour voir un peu. Merci beaucoup pour la commande et les explications.
    Je te souhaite un bonne journée !

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut
    j'ai testé le sed en reel avec le fichier, et je crois qu'il y a quelque chose qu'il a pas aimé:

    Sous linux si j'edite le fichier j'ai ceci:

    Tu vois il y a cd ^_ devant et donc le sed ne marche pas..Comment faire pour arranger ça?

    Et le segond truc avec code="9" ça marche pas non plus:
    Ca reste comme ça apres le sed.
    Je fais le sed comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/tag="001"/ s/>  *a/>/;/code="9"/ s/00*//' fichier.sql >luis.sql
    <subfield code="9">0006771


    D'avance merci

Discussions similaires

  1. Aide pour une expression régulière avec sed
    Par Loceka dans le forum Administration système
    Réponses: 4
    Dernier message: 05/10/2011, 09h48
  2. [RegEx] Expression régulière avec preg_match_all
    Par tit_oune dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2006, 23h28
  3. Expressions régulières avec variable
    Par killprog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/04/2006, 17h03
  4. Expression réguliére avec CHECK
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/09/2005, 17h38
  5. Expression régulière avec "|"
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2005, 15h09

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