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

Linux Discussion :

[Sed] Extraire un bloc de texte dont on connait les délimiteurs


Sujet :

Linux

  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut [Sed] Extraire un bloc de texte dont on connait les délimiteurs
    Bonjour tout le monde,

    Mon problème est assez simple, et j'ignore si on peut le faire avec sed (je dirais oui...).

    J'ai des fichiers en C qui contiennent des structures.
    Elles sont toujours définies ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct {
      unsigned char a[1234];
    } t_buffer_...
    Et le ... varie, ainsi que le contenu.
    L'idée est la suivante : extraire ce qui est entre les accolades à condition que le texte devant l'accolade ouvrante soit "typdef struct" et celui après l'accolade fermante "[ ]t_buffer_.*".
    Si je mets sur une seule ligne, ça marche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $>echo "typedef struct { t_buff[1234]; } t_buffer;" | sed 's/typedef struct {\(.*\)} t_buffer.*/aaa\1aaa/'
    aaa t_buff[1234]; aaa
    Si je le fais avec plusieurs lignes, l'ensemble du fichier s'affiche...
    Il me manque un truc, mais quoi... ?

    Je précise que je suis sur une machine qui n'a pas beaucoup d'outils (pas de python, seulement les outils unix de base : sed, awk, lex, yacc, etc.).

    Merci d'avance !
    JM

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    sed lis ligne par ligne, pour "matcher" une expression sur plusieurs il faut les "stocker" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo "typedef struct {
      unsigned char a[1234];
    } t_buffer_...
    typedef struct {
      unsigned char a[5678];
    } t_buffer_..." | sed ':Boucle; /t_buffer.*/! {N; bBoucle}; s/typedef struct {\n\(.*\)\n} t_buffer.*/aaa\1aaa/'
    aaa  unsigned char a[1234];aaa
    aaa  unsigned char a[5678];aaa
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Merci. Et si ce n'est pas mais J'ai essayé d'ajouter \n entre struct et { mais ça ne fonctionne pas...

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    euh, la différence ne saute pas aux yeux.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    euh, la différence ne saute pas aux yeux.
    Arf, pas fait attention, j'ai loupé mon saut de ligne .

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sed '/^typedef struct/{ :boucle; /t_buffer.*/! {N; bboucle}; s/typedef struct[\n ]{\n\(.*\)\n} t_buffer.*/aaa\1aaa/}' <(echo "typedef struct {
      unsigned char a[1234];
    } t_buffer_...
    typedef struct
    {
      unsigned char a[5678];
    } t_buffer_...")
    aaa  unsigned char a[1234];aaa
    aaa  unsigned char a[5678];aaa
    non, mais !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Merci !

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 07/05/2013, 13h37
  2. Réponses: 4
    Dernier message: 01/10/2012, 18h40
  3. Réponses: 3
    Dernier message: 23/06/2006, 16h52
  4. inclure une image dans un bloc de texte
    Par allowen dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 25/08/2005, 14h11
  5. [langage] Ecrire un bloc de texte dans un fichier
    Par sarahbes dans le forum Langage
    Réponses: 6
    Dernier message: 10/06/2004, 11h40

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