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

  1. #1
    Membre du Club
    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
    Points : 45
    Points
    45
    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 éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    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/'
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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
    $
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    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
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    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'
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    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
    Cordialement.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    [HS]
    Citation Envoyé par CosmoKnacki Voir le message
    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#'
    Personnellement et en ce qui me concerne moi-même en personne, je n'aime pas beaucoup le caractère "barre oblique" comme séparateur dans les substitutes de sed.
    Je sais bien que c'est le caractère le plus habituel, mais, outre le fait qu'il tombe souvent (comme ici) en conflit avec le séparateur de chemins, je trouve qu'il nuit à la lisibilité (notamment par son "caractère" (sic!) oblique).
    Je n'aime pas trop non plus le dièse que je trouve "lourd" et "encombrant" (en termes de pixels).
    Je leur préfère la "barre verticale" car je trouve que sa sobriété (léger espacement à gauche et à droite) facilite la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's|.*_toto/([^/]+)/.*| \1|'
    Après, les coups et les douleurs...
    [/HS]

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    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 éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    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!

  12. #12
    Membre du Club
    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
    Points : 45
    Points
    45
    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

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    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

  14. #14
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    A savoir que le "_toto" peut effectivement se retrouver plusieurs fois dans le path.
    Et donc dans ce cas tu vises quoi? Le premier, le dernier, le niéme, tous?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Et donc dans ce cas tu vises quoi? Le premier, le dernier, le niéme, tous?
    Avec cette technique, on peut viser de manière simple le premier ou le dernier!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mypath="H:/rep1/rep2/rep3/xxXXx/vcit_rrr_toto/my_folder/zzzz/eee_rr_tt/_toto/tata/eeeeee.txt"
    Pour viser le premier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mypath1=${mypath#*_toto/}
    echo ${mypath1%%/*}
    my_folder
    Pour viser le dernier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mypath2=${mypath##*_toto/}
    echo ${mypath2%%/*}
    tata

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par sebyo Voir le message
    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 :


    Par contre je n'ai pas saisie toutes les subtilités de cette syntaxe..

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

    Sebyo
    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
    Ici, l'astuce est de faire 2 commande sed:
    s#[^_]_toto/#GERIKO#nieme ==> ici, on modifie le "nieme" _toto par "GERIKO"
    s#.*GERIKO([^/]*)/.*#\1# ==> ici, on ne récupère que ce qui se trouve entre "GERIKO/" et le "/" suivant

    Par contre, je remarque une typo inutile sur la première commande qui peut porter à confusion, la bonne syntaxe serait plutôt:
    s#_toto/#GERIKO#niemedonc, par exemple, pour le 2ème _toto:
    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#_toto/#GERIKO#2;s#.*GERIKO([^/]*)/.*#\1#'
    tata
    Cordialement.

  17. #17
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    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
    Cette solution fonctionne également. Si je me trompe pas c'est la même chose qui est fait mais sur deux lignes. ô_o

    Pour répondre à la question, c'est le premier "_toto" que je souhaite cibler.

    Dans mon cas je voulais faire ça directement avec une seule expression régulière. Cela n'est pas possible avec SED qui prend pas en compte la notion de quantificateur non-gourmand si j'ai bien compris les commentaires plus haut..

    Merci disedorgue pour les explications sur la syntaxe utilisée et merci aux autres pour tous les éléments apportés au sujet.

    Sebyo

  18. #18
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Au pire, tu peux le faire via perl qui accepte lui les quantificateurs non gourmand:
    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" | perl -p -e 's#.*?_toto/(.*?)/.*#\1#'
    my_folder
    qui d'ailleurs en copiant/collant la regex que tu donnais dans ton premier post, fonctionne bien :
    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" | perl -p -e 's/(.*?)\_toto\/(.+?)(\/.+)/ \2/'
     my_folder
    Cordialement.

  19. #19
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    OK, donc pour obtenir la première occurrence avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's#_toto(/[^/]+)/.*#\1#;s#.*/##;'
    Détail de la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s#_toto(/[^/]+)/.*#\1#;  // on attrape le premier "_toto", on capture le folder suivant et on efface le reste
    s#.*/##;                 // on efface tout jusqu'au dernier slash inclus
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  20. #20
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Au pire, tu peux le faire via perl qui accepte lui les quantificateurs non gourmand:
    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" | perl -p -e 's#.*?_toto/(.*?)/.*#\1#'
    my_folder
    qui d'ailleurs en copiant/collant la regex que tu donnais dans ton premier post, fonctionne bien :
    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" | perl -p -e 's/(.*?)\_toto\/(.+?)(\/.+)/ \2/'
     my_folder
    Je valide perl :-), merci c'est top. J'avais pris SED un peu au pif. Je vais aussi m'intéresser à Perl du coup.

    CosmoKnacki ta solution est intéressant aussi. :-)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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