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 :

Récupérer une chaîne de caractères derrière le dernier anti-slash \


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    bidouilleur
    Inscrit en
    Novembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 44
    Par défaut Récupérer une chaîne de caractères derrière le dernier anti-slash \
    Bonjour à tous.

    Dans un script .cmd sous windows je cherche à récupérer une chaîne de caractère qui se situe après le dernier anti-slash \.
    Je précise que j'utilise gnu utilities for win32, je peux donc utiliser sed, grep, awk sans problème, mais je suis bloqué sur ce problème certainement tout bête.

    Exemple: mon fichier contient des lignes du type:

    %USERPROFILE%\AppData\Local\Application\Resources\fichier.dll
    %WINDIR%\System32\autrefichier.dll
    ...

    et je souhaiterais récupérer:

    fichier.dll
    autrefichier.dll
    ...

    Je me doute que ça va vous sembler tout simple mais je suis bloqué.
    Merci par avance de l'aide que vous m'apporterez.

  2. #2
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 564
    Par défaut
    Bonjour,

    Essaie cette commande, F est le séparateur de champ et NF le nombre de champ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F"\" '{ print $NF }' tonscript
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\\ '{ print $NF }' tonscript
    Pour plus de connaissances sur awk, le tutoriel (cf. III-4. Les variables système) :
    http://nyal.developpez.com/tutoriel/gawk
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Bonjour,
    une version sed:

  4. #4
    Membre averti
    Homme Profil pro
    bidouilleur
    Inscrit en
    Novembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 44
    Par défaut
    Merci à vous deux. Toutefois je n'ai pas réussi avec awk (certainement un problème de syntaxe de ma part) mais pas de souci avec sed, c'est exactement ce que je cherchais.
    Merci à vous.

  5. #5
    Membre averti
    Homme Profil pro
    bidouilleur
    Inscrit en
    Novembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 44
    Par défaut
    Bon je retire temporairement le résolu et reviens vers vous, car j'ai un autre problème mais toujours avec la gestion des anti-slash, donc je ne recrée pas un sujet pour ça.
    Maintenant je me retrouve avec une ligne du type:

    "une_chaine_quelconque"="C:\\Windows\\fichier.dll C:\\Users\\moi\\AppData\\Local\\Application\\Resources\\autrefichier.dll C:\\Windows\\eventuellement_encore_un_fichier.dll"

    Je souhaite supprimer un seul des fichiers (avec le chemin) en sachant que la ligne est alléatoire, il peut y avoir un/des fichier(s) avant comme après (mais bien souvent le fichier à supprimer est seul sur la ligne).
    Je veux donc obtenir quelque chose comme ça:

    "une_chaine_quelconque"="C:\\Windows\\fichier.dll C:\\Windows\\eventuellement_encore_un_fichier.dll"

    ou si le fichier était seul:

    "une_chaine_quelconque"=""

    Encore une fois rien de très compliqué, j'utilise switch car simple d'utilisation, le problème c'est que je pense que le caractère d'échappement de switch doit être le \ du coup je me retrouve avec la même ligne saus que les anti-slash ne sont plus doublés.
    Ma question, est il possible de définir un autre caractère d'échappement à switch ? Ou faut-il procéder d'une autre façon et si oui comment ?

    Merci encore.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Je ne connais pas la commande switch, mais sous unix, l'anti-slash sert à quotter le carctère qui le suit, il est donc normal que '\\' se transforme en '\'.
    Sinon, pour répondre à ton problème, et bien il nous faudrait savoir comment fait-on pour déterminer quel "fichier" doit disparaitre de ta liste ?

  7. #7
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 564
    Par défaut
    Citation Envoyé par Christophe.G Voir le message
    (...) Toutefois je n'ai pas réussi avec awk (certainement un problème de syntaxe de ma part) ...
    @Christophe.G
    Bien vu, j'ai écrit sans vérifier (pas la même configuration que chez toi ...)
    voir jack-ft que je remercie ci-après
    Citation Envoyé par jack-ft Voir le message
    Attention! Dans une chaîne entre guillemets, le backslash est interprété !
    \t => tabulation \n => line feed et \" => guillemet !!!
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  8. #8
    Membre averti
    Homme Profil pro
    bidouilleur
    Inscrit en
    Novembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 44
    Par défaut
    Bon j'ai finalement réussi à supprimer cette ligne sans toucher aux autres, mais probablement pas de manière très propre car je devais travailler sur la donné de valeur (qui contient toutes les lignes) dans une variable du type !mavar!
    Du coup impossible de traiter les \\ avec sed. J'ai donc remplacé les \\ dans ma variable comme ceci:

    Je remplace les \\ en zzzy qui ne risque pas d'exister et ne contient pas de caractère spécial.
    Puis un coup de sed pour supprimer la chaine que je voulais sans toucher aux autres (la plus de problème).
    Et pour finir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mavar=!mavar:zzzy=\\!
    mavar=!mavar: "="!
    1 Je remet les \\ à la place de zzzy
    2 Je supprime l'espace créé entre le premier fichier.dll resté et le double quote " du à la suppression.

    Reste à voir si la suppression de l'espace ne provoque pas une erreur s'il n'y avait que le fichier à supprimer en donné donc pas d'espace à virer dans ce cas il ne reste que "une_chaine_quelconque"="".
    Après je ne pense pas que cela pose problème (niveau du registre) si je ne supprimais pas cet espace et que cela donne "une_chaine_quelconque"=" ".

    En tout cas merci à tous pour votre attention ainsi que votre aide.
    Ah et si quelqu'un se sent pour une petite explication pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's,.*,s/&//,;s,\\,\\\\,g' in | sed -f - -e 's/  / /g' xx
    je suis preneur (juste pour comprendre)

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par Escapetiger Voir le message
    Essaie cette commande, F est le séparateur de champ et NF le nombre de champ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F"\" '{ print $NF }' tonscript
    Attention! Dans une chaîne entre guillemets, le backslash est interprété !
    \t => tabulation \n => line feed et \" => guillemet !!!

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F"\\" '{ print $NF }' tonscript
    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'\' '{ print $NF }' tonscript

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Un exemple en sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat in
    C:\\Users\\moi\\AppData\\Local\\Application\\Resources\\autrefichier.dll
    $ cat xx
    "une_chaine_quelconque"="C:\\Windows\\fichier.dll C:\\Users\\moi\\AppData\\Local\\Application\\Resources\\autrefichier.dll C:\\Windows\\eventuellement_encore_un_fichier.dll"
    $ sed 's,.*,s/&//,;s,\\,\\\\,g' in | sed -f - -e 's/  / /g' xx
    "une_chaine_quelconque"="C:\\Windows\\fichier.dll C:\\Windows\\eventuellement_encore_un_fichier.dll"
    Attention: pour le fichier qui contient les valeurs de suppression (mon fichier in), il faut que chaque valeur que tu veux supprimer se trouve sur une ligne différente.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2009, 07h19
  2. sql récupérer une chaîne de caractères dans un champ
    Par ritchie23 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/05/2009, 12h12
  3. comment récupérer une chaîne de caractères
    Par the_crow_man dans le forum C
    Réponses: 8
    Dernier message: 04/07/2008, 15h39
  4. Réponses: 3
    Dernier message: 27/05/2008, 20h05
  5. [OS Perso] Récupérer une chaîne de caractères
    Par log2n dans le forum Programmation d'OS
    Réponses: 31
    Dernier message: 14/02/2006, 13h56

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