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 dans un bash


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut RegEx dans un bash
    Bonjour
    Je ne suis vraiment pas bon en RegEx et je voudrais faire un petit script pour automatisez le changement d'un fichier.
    C'est un fichier dont je vais avoir besoin sur différent serveurs et je ne voudrais pas changer les données à la main à chaque fois.

    Le fichier s'appelle toto

    Je voudrais faire un truc du genre:
    Cp –p toto toto.orig
    Remplace dans toto ce qui est entre http:// et le premier / avec une données que la console attend
    Remplace dans toto XXX01 exactement (genre pas XXX01 et quelque chose apres) avec une données que la console attend
    Remplace dans toto ce qui est entre "record/" et "/" avec une données que la console attend
    Remplace dans toto ce qui est entre " patron/" et "/" avec une données que la console attend

    Voila si quelqu'un peut aider merci beaucoup

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,


    Voici une réponse pour te donner une piste, écrite en Python car je ne connais pas bash.

    Elle comporte le remplacement de portions comprises entre deux repères pour lequel le recours aux regex se justifie.

    Par contre, si ce que tu entends par « XXX01 exactement (genre pas XXX01 et quelque chose apres) » est que ’XXX01’ doit être précédé et suivi de blancs, il n’y a pas réellement besoin de regex pour remplacer ’ XXX01 ’, une fonction replace() suffit.


    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re
     
    ch = '''Voici une URL : http://fr.wikipedia.org/wiki/Carotte
    La lot XXX01 est arrive en bon etat.
    Mais le produit XXX01-5467 a fondu un peu.
    Fiche technique actualisee: XTF/machinery/lituanian/record/absheim/soex'''
     
    print '~~~ Valeur de ch avant traitement :\n'+ch+'\n'
     
    for x in ('http://','record/'):
        y = raw_input('Entrer la valeur de remplacement de ce qui se trouve entre '+x+' et / : \n')
        ch = re.sub(x+'([^/]+)',x+y,ch)
        print '~~~ Valeur de ch apres ce remplacement :\n'+ch+'\n'

    ~~~ Valeur de ch avant traitement :
    Voici une URL : http://fr.wikipedia.org/wiki/Carotte
    La lot XXX01 est arrive en bon etat.
    Mais le produit XXX01-5467 a fondu un peu.
    Fiche technique actualisee: XTF/machinery/lituanian/record/absheim/soex

    Entrer la valeur de remplacement de ce qui se trouve entre http:// et / :
    maisonette
    ~~~ Valeur de ch apres ce remplacement :
    Voici une URL : http://maisonette/wiki/Carotte
    La lot XXX01 est arrive en bon etat.
    Mais le produit XXX01-5467 a fondu un peu.
    Fiche technique actualisee: XTF/machinery/lituanian/record/absheim/soex

    Entrer la valeur de remplacement de ce qui se trouve entre record/ et / :
    ARM345
    ~~~ Valeur de ch apres ce remplacement :
    Voici une URL : http://maisonette/wiki/Carotte
    La lot XXX01 est arrive en bon etat.
    Mais le produit XXX01-5467 a fondu un peu.
    Fiche technique actualisee: XTF/machinery/lituanian/record/ARM345/soex

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Salut eyquem
    Merci beaucoup
    j'ais vraiment besoin que se soit fait en bash ou autre shell,
    mais je te pique la RegEx
    @+

  4. #4
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    sed est le plus indiqué, qqch du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    read -p "Site : " SITE
    read -p "Remplaçement1" R1
    read -p "Record : " R2
    read -p "Patron : " R3
    sed -e "s|http://[^/].*/|http://$SITE/|" -e "s|XXX01|$R1|" -e "s|record/[^/].*/|record/$R2/|" -e "s|patron/[^/].*/|patron/$R3/|" toto
    ATTENTION : il ne faut pas que le fichier contienne des '|', sinon, utiliser un autre séparateur.
    Si ça marche, ajouter l'option -i pour modifier directement le fichier :

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Genial
    Merci beaucoup
    ca a l'air de marcher
    @+

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Pas mal sed , je connais un tout petit peu.

    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "s|http://[^/].*/|http://$SITE/|"
    va provoquer des erreurs à cause du point.
    Il faut au moins enlever ce point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "s|http://[^/]*/|http://$SITE/|"

    Sinon la regex qui est créée à partir de http://[^/].*/ va matcher de la façon suivante:
    d’abord avec http://’ puis le premier caractère suivant à condition qu’il soit différent de ’/’ puis tous les caractères possibles (y compris ’/’) jusqu’au dernier ’/’.

    Les regex ont en effet un comportement glouton: .+ et .* font consommer du texte autant qu’une regex en trouve à consommer tant que ça ne brise pas le matching.




    On pourrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "s|http://[^/].*?/|http://$SITE/|"
    mais il n’y aurait pas d’intérêt à mettre [^/] dans ce cas.




    En fait la meilleure expression est celle-ci, dans laquelle les deux caractères / après [^/]* et '/' apres 'SITE' ont été enlevés car inutiles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "s|http://[^/]*|http://$SITE|"

    [^/] signifiant “no caractère ’/’ “ , la regex arrètera le matching juste devant le premier ’/’ rencontré.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut merci
    merci
    je vais essaye ca aussi j'enverrais le script d'ici 48h avec ce qui marhe le mieux

  8. #8
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Pas mal sed , je connais un tout petit peu.

    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "s|http://[^/].*/|http://$SITE/|"
    va provoquer des erreurs à cause du point.
    Il faut au moins enlever ce point.
    Ooops !
    J'ai fait ça un peu vite et sans assez réfléchir, merci d'apporter cette correction indispensable. Je ne suis pas encore très familier des regex en général.
    Ce dont je suis presque certain, c'est que sed est le plus approprié pour ce qui est demandé.

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut RegEx ok mais
    Bonjour
    la regex march impec mais:

    je dois prendre des info du standard output mais je n'ai pas le droit d'utiliser "read" (non installe) a mon boulot
    donc j'ai essaye
    echo "Please enter the FE url like URLORT"
    set SITE = `read_line`
    echo "Please enter the bibliographic library code like XXX01"
    set R1 = `read_line`
    echo "Please enter a record number 9 digit"
    set R2 = `read_line`
    echo "Please enter the patron ID"
    set R3 = `read_line`
    echo "Please enter administrative library like XXX50"
    set R4 = `read_line`

    mais ca marche pas
    quelqu'un a une idee
    La regex est sed -i -e "s|http://[^/]*|http://$SITE|" test_rest.html -e "s|BBR01|$R1|" -e "s|record/[^/].*/|record/$R2/|" -e "s|patron/[^/].*/|patron/$R3/|" -e "s|BBR50|$R4|"

    Merci

  10. #10
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Qu'est-ce qui ne marche pas ?
    Quelle est la valeur des variables ?
    D'abord : avec sed, le nom de fichier doit se trouver en dernier...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -e "s|http://[^/]*|http://$SITE|" -e "s|BBR01|$R1|" -e "s|record/[^/].*/|record/$R2/|" -e "s|patron/[^/].*/|patron/$R3/|" -e "s|BBR50|$R4|" test_rest.html
    On peut très bien faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "SITE='$SITE' - R1='$R1' - R2='$R2' - R3='$R3' - R4='$R4'"
    pour connaître leur valeur. Ensuite essayer les regex étape par étape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sed "s|http://[^/]*|http://$SITE|" test_rest.html
    sed "s|BBR01|$R1|" -e "s|record/[^/].*/|record/$R2/|" test_rest.html
    sed "s|patron/[^/].*/|patron/$R3/|" test_rest.html
    sed "s|BBR50|$R4|" test_rest.html
    pour trouver où ça coince..

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut set SITE = `read_line`
    mon probleme c'est que
    set SITE = `read_line` me demande de rentrer une donnee mais quand je fais echo $SITE pour verifier la valeur $SITE est vide!
    le truc c'est que je ne peut pas utiliser "read" et que set SITE = `read_line` je l'utilise mal apparement.

    Voila

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Je ne comprend pas : comment est-il possible de "désactiver" une commande interne de bash ?

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut read: Command not found.
    Ben je ne sais pas non plus mais ca marche pas ici

Discussions similaires

  1. Commande grep/sed dans script bash avec regex
    Par 1r2R1 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 02/04/2014, 17h49
  2. [RegEx] supprimer <a href...</a> par regex dans pages html.
    Par moldak dans le forum Langage
    Réponses: 10
    Dernier message: 15/11/2012, 17h02
  3. Regex dans la fonction replace ?
    Par Mr6 dans le forum VBScript
    Réponses: 3
    Dernier message: 19/03/2007, 15h51
  4. regex dans fichier XML
    Par pouss dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 10/10/2006, 10h35
  5. regex dans hashage
    Par scorbo dans le forum Langage
    Réponses: 3
    Dernier message: 17/03/2006, 11h21

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