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 :

Regex SED / comportement différent sous Notepad++


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Avril 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 65
    Par défaut Regex SED / comportement différent sous Notepad++
    Bonjour,

    Je débute dans les expressions régulières avec SED.

    Le problème est le suivant. Je souhaite extraire le nom d'un dossier dans mon path qui peut varier (actuellement je cible ce nom de dossier avec un split awk)

    path :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt
    expression régulière qui fonctionne sous notepad++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (.*?\_toto\/)(.+?)(\/.+)
    la commande SED utilisée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| sed -r 's/(.*?)\_toto\/(.+?)(\/.+)/ \2/'
    résultat sous notepad++ : "my_folder"
    résultat avec SED : "my_folder/zzzz/eee_rr_tt/toto_tata"

    Avez-vous une solution afin que mon expression régulière ait le même comportement via SED?

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,
    Différence en rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| sed -r 's/(.*?)\_toto\/([^\/]+?)(\/.+)/ \2/'

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| sed -r 's/(.*?)\_toto\/(.+?)(\/.+)/ \2/'
     my_folder/zzzz/eee_rr_tt/toto_tata
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| sed -r 's/(.*?)\_toto\/([^\/]+?)(\/.+)/ \2/'
     my_folder
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| awk -F'/' '{print $7}'
    my_folder
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| awk -F'/' '{for (i=1;i<=NF;i++) if ($i~/toto$/) print $(i+1)}'
    my_folder
    $

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Et le pendant sed de "awk -F'/' '{print $7}'":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| sed -r 's/(([^\/]+)\/){7}.+/\2/'
    my_folder

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Ce "print $7" n'était là que pour ouvrir des horizons. Sinon, il est plus simple d'utiliser un bon vieux "cut":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| cut -d/ -f7
    my_folder

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Sed en mode étendu n'interprète pas .+? comme tu pourrais t'y attendre. Dans ce contexte, la notion de quantificateur non-gourmand n'existe tout simplement pas. .+? est ici interprété comme (.+)?. Par exemple, si tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '/root/_toto/' | sed -r 's/_toto[^\/]+?//'
    tu obtiendras /root//.

    Donc la solution est d'utiliser comme l'a suggéré disedorgue, une classe de caractère excluant le slash. Par contre tu peux enlever tous les points d'interrogation ainsi que l'échappement du underscore qui n'est pas un caractère spécial. Tu peux aussi changer de délimiteur pour éviter d'avoir à échapper tous les slashes et retirer les groupes inutiles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's#.*_toto/([^/]+)/.*# \1#'
    Un seul problème demeure, si tu as plusieurs fois _toto/ sur la même ligne, tu obtiendras toujours le résultat pour la dernière occurrence. Dans ce cas on peut utiliser une boucle conditionnelle pour amener la première occurrence au début de la chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r ':a;s/^[^_]*_//;s#^toto/([^/]+)/.*# \1#;ta'

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Avril 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 65
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et le pendant sed de "awk -F'/' '{print $7}'":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"| sed -r 's/(([^\/]+)\/){7}.+/\2/'
    my_folder
    Pour mon cas je veux éviter de me focaliser sur l'argument n°7 par exemple. Mon mot clef "my_folder" doit pouvoir être quasiment partout. Il est juste précédé de "_toto".

    A savoir que le "_toto" peut effectivement se retrouver plusieurs fois dans le path.

    la solution suivante semble être la plus adaptée :
    Citation Envoyé par disedorgue Voir le message
    Si on a plusieurs fois le même pattern (dans notre cas "_toto") et que l'on sait lequel nous intéresse, on peut éventuellement le faire en 2 passes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/_toto/tata/eeeeee.txt" | sed -r 's#[^_]_toto/#GERIKO#1;s#.*GERIKO([^/]*)/.*#\1#'
    my_folder
    $ echo "H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/_toto/tata/eeeeee.txt" | sed -r 's#[^_]_toto/#GERIKO#2;s#.*GERIKO([^/]*)/.*#\1#'
    tata
    Par contre je n'ai pas saisie toutes les subtilités de cette syntaxe..

    En tout cas merci pour toutes ces réponses!!

    Sebyo

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Et que penses-tu de la solution bash que j'ai proposée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ mypath="H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/_toto/tata/eeeeee.txt"
    $ mypath=${mypath#*_toto/}  # retirer le plus court chemin à gauche contenant *_toto/
    $ echo ${mypath%%/*}        # retirer le / et tout ce qui suit
    my_folder

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par sebyo Voir le message
    Je souhaite extraire le nom d'un dossier dans mon path qui peut varier (actuellement je cible ce nom de dossier avec un split awk)

    path :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt
    expression régulière qui fonctionne sous notepad++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (.*?\_toto\/)(.+?)(\/.+)
    Avez-vous une solution afin que mon expression régulière ait le même comportement via SED?
    Je suis surpris autant qu'étonné de ne pas voir intervenir N_BaH. Serait-il en vacances?

    ou alors, c'est parce que l'utilisateur demande plus ou moins explicitement une regexp sed?

    Bref, voici une proposition de solution plutôt assez simple en bash:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ mypath="H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt"
    $ mypath=${mypath#*_toto/}
    $ echo ${mypath}
    my_folder/zzzz/eee_rr_tt/toto_tata/eeeeee.txt
    $ mypath=${mypath%%/*}
    $ echo ${mypath}
    my_folder

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Je leur préfère la "barre verticale"
    Dans une conduite, la première chose que l'on recherche, ce sont les barres verticales pour séparer les instructions. Pas très lisible, donc.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Dans une conduite, la première chose que l'on recherche, ce sont les barres verticales pour séparer les instructions. Pas très lisible, donc.
    C'est pas faux!
    Mais, comme je ne suis pas très expert en awk et sed, j'ai souvent plusieurs instructions chaînées (probablement plus qu'il n'en faudrait ).
    Et comme j'aime bien que ce soit lisible et pouvoir facilement en changer l'ordre, en enlever ou en ajouter, je choisis généralement de finir chaque instruction par une séquence "TAB \ RET" (avec ce qu'il faut comme indentation (gérée par emacs (évidemment))).
    Du coup, les "pipes" séparateurs d'instructions sont tous en début de ligne... ce qui fait que je n'ai pas à les chercher!
    Voili!

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

Discussions similaires

  1. comportement différent sous l'IDE
    Par Négrier dans le forum Langage
    Réponses: 4
    Dernier message: 23/12/2010, 23h03
  2. Réponses: 5
    Dernier message: 14/11/2010, 22h53
  3. Comportement de <tr> différent sous IE et FF
    Par tofito dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 25/07/2009, 20h39
  4. Réponses: 4
    Dernier message: 28/05/2008, 21h56
  5. eval() comportement différent sous FF et IE
    Par hush dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2007, 00h19

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