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 remplacer la 1ere occurence


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Regex remplacer la 1ere occurence
    Bonjour,

    je voudrai remplacer toute occurrence majuscule par minuscule en fonction d'un regex. Malheureusement pour moi, quand il trouve le regex dans une ligne, il change du regex jusqu'à la fin de la ligne.
    Ligne: <texte id="cellule_10" taille="50" table="pap_MH" champ="DénOMINATI" label="Dénomination" unite="" ancrableable="oui" />
    Commande shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/champ=\".*\".*/\L\0/' mon_fichier_qui_contient_le_texte.txt
    Je voudrai juste mettre tout ce qui est dans champ="" en minuscule sur chaque ligne de mon fichier.

    Merci bien.
    Albin

  2. #2
    Membre à l'essai
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Même cette ligne de commande ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/champ=\".*\"/\L\0/'
    mon_fichier_qui_contient_le_texte.txt

    Merci bien,
    Albin

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\(champ="\)\([^"]*\)/\1\L\2/'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  4. #4
    Membre à l'essai
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci bien ! ça marche. Et j'ai un autre souci: remplacer maintenant les caractères accentués comme "é" par "e", "è" par "e", "à" par "a" toujours dans ce même contexte. Je ne trouve pas comment faire mon regex.

    Toujours cette même ligne: <texte id="cellule_10" taille="50" table="pap_MH" champ="dénominati" label="Dénomination" unite="" ancrableable="oui" />

  5. #5
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Il n'y a pas de regex pour la substitution de caractères accentués, c'est du littéral à la façon de la commande tr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 'y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/'
    C'est la même chose avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr 'àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ' 'aceeeeiioouuuACEEEEIIOOUUU'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  6. #6
    Membre à l'essai
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Justement, je sais ça...mais c'est toujours le fameux champ="" que je veux les remplacer. Je ne sais pas comment m'y prendre.

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

    Voici un exemple pour le "é":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/é/e/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/'
    En principe, la seule partie à compléter est sur la commande de substitution littéral (y/é/e/)
    Cordialement.

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Voici un exemple pour le "é":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/é/e/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/'
    En principe, la seule partie à compléter est sur la commande de substitution littéral (y/é/e/)
    Bien vu, fallait y penser

    Concernant le y/é/e/, pour généraliser le tout, il suffit de déclarer 2 variables avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A='àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ'; B='aceeeeiioouuuACEEEEIIOOUUU'
    Puis de changer ta syntaxe par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/'${A}'/'${B}'/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #9
    Membre à l'essai
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    ça remplace bien les "é" par "e" par contre il duplique certaines lignes de mon fichier.
    Ligne originale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <cellule id="cellule_9">
                <texte id="cellule_10" taille="50" table="cof_gp_MH" champ="DénOMINATI" label="Dénomination" />
              </cellule>
              <cellule id="cellule_13">
                <texte id="cellule_14" taille="254" table="cof_gp_MH" champ="élémENTS_P" label="Element principal" />
              </cellule>
    Ligne après le passage de la commande shell:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <cellule id="cellule_9">
              <cellule id="cellule_9">
                <texte id="cellule_10" taille="50" table="cof_gp_MH" champ="denominati" label="Dénomination" />
              </cellule>
              </cellule>
              <cellule id="cellule_13">
              <cellule id="cellule_13">
                <texte id="cellule_14" taille="254" table="cof_gp_MH" champ="elements_p" label="Element principal" />
              </cellule>

  10. #10
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Rajoute /champ=/{} comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e '/champ=/{s/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/'${A}'/'${B}'/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/}'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  11. #11
    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 Réponse complète à la question
    Bonjour,

    attention, ça pique les yeux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cat sedtest.txt
    <texte id="cellule_10" taille="50" table="pap_MH" champ="DénOMINATI" label="Dénomination" unite="" ancrableable="oui" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed '/champ=/{s/\(.*\)\(champ="[^"]*"\)\(.*\)/\2\n\1\n\3/;h;s/\n.*//;y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/;s/\(champ="\)\([^"]*\)/\1\L\2/;G;s/\(.*\)\n\(.*\)\n\(.*\)\n\(.*\)/\3\1\4/}' sedtest.txt
    <texte id="cellule_10" taille="50" table="pap_MH" champ="denominati" label="Dénomination" unite="" ancrableable="oui" />
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Membre à l'essai
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    ça marche magnifiquement bien.
    Merci à Flodelarab, zipe31 et disedorgue.

    Respect !

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Rajoute /champ=/{} comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e '/champ=/{s/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/'${A}'/'${B}'/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/}'
    Juste un petit détail: pour une meilleur compatibilité des différents sed, ne pas oublier le ";" avant la fermeture du bloc de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e '/champ=/{s/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/'${A}'/'${B}'/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/;}'
    Cordialement.

  14. #14
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Juste un petit détail: pour une meilleur compatibilité des différents sed, ne pas oublier le ";" avant la fermeture du bloc de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e '/champ=/{s/\(champ="[^"]*"\)/XXX\1YYY/;h;s/.*XXX/VVV/;s/YYY.*/WWW/;s/.*/\L&/;y/'${A}'/'${B}'/;G;s/vvv\(.*\)www\n\(.*\)XXX.*YYY/\2\1/;}'
    C'est vrai, merci. Bien que nous soyons dans le forum "Shell et commandes GNU", comme GNU sed
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  15. #15
    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
    Puisqu'on évoque les détails: XXX YYY et WWW peuvent se trouver dans la ligne. Mais pas \n .

    Voilà pourquoi c'est plus robuste de prendre \n comme séparateur repérable.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    C'est vrai, sauf si dans les regex comprenant les XXX,YYY,VVV,WWW (ainsi que les vvv,www...) , j'avais préciser le pattern de base \(champ="[^\]*"\). Mais je reconnais que je l'ai joué faignasse
    Cordialement.

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

Discussions similaires

  1. REmplacer la deuxième occurence dans un fichier
    Par EDrequest dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2006, 21h34
  2. [Regex] Remplacement d'une chaîne avec $
    Par TSnarfK dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 27/01/2006, 10h44
  3. [Regex]Remplacement d'un nombre indéfinie de motif
    Par gege2061 dans le forum Langage
    Réponses: 5
    Dernier message: 14/01/2006, 17h27
  4. Borland C++ 5.5 remplacer toutes les occurences
    Par cdelamarre dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 30/11/2005, 12h23
  5. Réponses: 5
    Dernier message: 03/02/2005, 13h59

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