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 :

[sed] Expression regulière


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Août 2012
    Messages : 22
    Points : 33
    Points
    33
    Par défaut [sed] Expression regulière
    Bonjour,

    Désolé si je fais le "client", mais en sed, je ne me souviens plus (je n'en ai pas fait longtemps, et il y a longtemps), et je ne trouve pas l'expression décrivant "qqsoit".

    Je m'explique, je veux remplacer via sed, l'expression
    <file>peu_importe</file>
    par
    <file>mon_pattern</file>
    Et je ne sais plus comment formuler le peu_importe dans ma commande sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's#<file>peu_importe</file>#<file>autre_chose</file>#g'
    (j'utilise le séparateur # pour éviter les embrouilles de /\ etc ... )
    Le autre_chose, je m'en arrange.

    Je vous remercie par avance pour toute aide apportée.

  2. #2
    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
    salut,

    basiquement on pourrait traduire ça par "un nombre quelconque de caractères quelconques qui se suivent", on pourrait alors simplement utiliser .*, le point est un caractère quelconque, l'astérisque représente "zéro ou plus" caractère(s)

    dans les expressions rationnelles on fait en général la distinction entre * (zéro ou plus) et + (un ou plus) mais le moteur de regex qu'utilise sed par défaut ne fait pas cette distinction, on peut alors lui demander d'utiliser des regex étendues avec l'option -r

    par ailleurs la question peut éventuellement se poser si on a plusieurs correspondances dans la même ligne, par exemple <file>bla</file>pouet<file>coincoin</file>, intervient alors la notion de gourmandise, par défaut .+ est considéré comme gourmand, c'est le cas de sed également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | sed -e 's#<file>\(.*\)</file>#\1#'    # regex gnu, par défaut
    bla</file>pouet<file>coincoin   # note: la 1ere et la derniere balise ont disparu
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | sed -r 's#<file>(.+)</file>#\1#'      # regex étendue
    bla</file>pouet<file>coincoin
    alors qu'en fait ce qui nous intéresse c'est en général soit uniquement bla, soit bla et coincoin séparément
    on utilise alors l'opérateur non-gourmand (non-greedy) .+?, le problème étant que sed ne le reconnait pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | sed -e 's#<file>\(.*\?\)</file>#\1#'
    bla</file>pouet<file>coincoin
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | sed -r 's#<file>(.+?)</file>#\1#'
    bla</file>pouet<file>coincoin
    une alternative intéressante est à base grep via ses options -P, -o et \K quand elles sont disponibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | grep -Po '<file>\K.+(?=</file>)'      # greedy
    bla</file>pouet<file>coincoin
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | grep -Po '<file>\K.+?(?=</file>)'     # non-greedy
    bla
    coincoin
    et sinon on sort l'artillerie pas-si-lourde-que-ça avec perl, et pour le coup on fait exactement ce qu'on veut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | perl -ne 'print $tab[0] if (@tab = $_ =~ m#<file>(.+?)</file>#g)'
    bla
    $ echo '<file>bla</file>pouet<file>coincoin</file>' | perl -ne 'print join("---", @tab) if (@tab = $_ =~ m#<file>(.+?)</file>#g)'
    bla---coincoin

Discussions similaires

  1. Recherche recursive à l'aide des expressions reguliére
    Par titoff dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/12/2005, 16h42
  2. [RegEx] aide pour une expression regulière
    Par hugo123 dans le forum Langage
    Réponses: 5
    Dernier message: 24/11/2005, 15h41
  3. ET dans une expression regulière
    Par kesako dans le forum Langage
    Réponses: 4
    Dernier message: 10/11/2005, 12h57
  4. Problème expression regulière ??
    Par panaone dans le forum Langage
    Réponses: 5
    Dernier message: 18/08/2005, 13h41
  5. Variables et Expression Regulière
    Par Temari dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2005, 01h55

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