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 :

[regex] substitution avec sed


Sujet :

Linux

  1. #1
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut [regex] substitution avec sed
    Bonjour à tous,

    Je suis en train de faire des modifs sur de nombreux fichiers et j'ai une substitution à faire (j'utilise sed).

    Elle consiste à trouver tout les string <blabla>enum. et de les remplacer par <blabla>inter_enum. en excluant les strings <blabla>_enum.

    J'ai essayé ce regex avec un simulateur de regex:

    qui fonctionne, mais lorsque je le met dans mon sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "s+(?!_)enum\.+iter_enum\.+g" <file>
    ça ne fonctionne plus.... Je ne sais pas si c'est ça, mais j'utilise une version de sed qui est relativement datée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed --version 
    GNU sed version 4.1.5
    Copyright (C) 2003 Free Software Foundation, Inc.
    et j'ai cru comprendre en cherchant à droite à gauche que ça pouvait venir du fait que (?!_) n'était pas implémenté sur les anciennes regex...

    ce truc va me rendre dingue

    si vous avez des idées, vous m'éviterez peut-être l'asile

    edit: j'ai également essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "s+[^_]enum\.+iter_enum\.+g" <file>

    mais il transforme (par ex)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (enum.hasMoreElements()) {
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while inter_enum.hasMoreElements()) {
    (i.e. il me vire le caractère précédent ce qui est gênant lorsqu'il s'agit d'une parenthèse ou d'un espace non suprimable)

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Essaye ça : sed 's/\(.[^ ]*[^_]\)\(enum\)/\1inter_\2/g'

    Édit : Correction de la regex

  3. #3
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    bon c'est du chinois mais ça marche !!!

    merci

  4. #4
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Oups la regex n'est pas bonne

    La bonne c'est celle là : sed 's/\(.[^ ]*[^_]\)\(enum\)/\1inter_\2/g' ...

    Je corrige l'autre

  5. #5
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    j'abuse si je te demande une petite explication sur ce regex?

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    \(.[^ ]*[^_]\)
    Les "(...)" représentent des sous-expressions. Les parenthèses doivent être protégées à défaut d'utiliser l'option "-r". Cette syntaxe permettra de réutiliser le bloc mis en correspondance par la sous-expression en lui attribuant une valeur (de 1 à 9).

    .[^ ]*[^_]
    On recherche une chaîne de caractères exempte d'espace "[^ ]" et ne se terminant pas par underscore "[^_]"

    \(enum\)
    Cette chaîne sera suivie du motif "enum". Motif qu'on regroupe dans une nouvelle sous-expression.


    \1inter_\2
    Chaque sous-expression mise en correspondance précédemment est ici appelée par son numéro (protégé par un backslash) d'apparition et en y intercalant le motif "inter_".
    Le \1 correspond à la partie avant "enum"
    Le \2 correspond à "enum".

    Le "g" en fin d'expression permet d'appliquer globalement sur l'ensemble d'une ligne autant de fois que nécessaire

  7. #7
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    wouaw très clair, merci beaucoup!!

Discussions similaires

  1. [sed ou bash] substitution avec des '/'
    Par pfxxx dans le forum Linux
    Réponses: 2
    Dernier message: 17/08/2010, 15h17
  2. Recherche avec sed insensible à la casse
    Par _Mac_ dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 12/10/2005, 16h42
  3. Script bash : Pb avec sed
    Par fred64 dans le forum Linux
    Réponses: 3
    Dernier message: 19/08/2005, 12h24
  4. [Regex] Pb avec replaceFirst
    Par elitost dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 21/07/2005, 00h41
  5. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 10h34

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