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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    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 Expert
    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
    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 averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    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 expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    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 averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    Par défaut Genial
    Merci beaucoup
    ca a l'air de marcher
    @+

  6. #6
    Membre Expert
    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
    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 averti
    Inscrit en
    Juin 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 27
    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 expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    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é.

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, 16h49
  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, 16h02
  3. Regex dans la fonction replace ?
    Par Mr6 dans le forum VBScript
    Réponses: 3
    Dernier message: 19/03/2007, 14h51
  4. regex dans fichier XML
    Par pouss dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 10/10/2006, 09h35
  5. regex dans hashage
    Par scorbo dans le forum Langage
    Réponses: 3
    Dernier message: 17/03/2006, 10h21

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