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 POSIX Discussion :

[awk] Groupement de regex


Sujet :

Shell et commandes POSIX

  1. #1
    Membre chevronné Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Par défaut [awk] Groupement de regex
    Bonjour tous le monde,

    Je bosse sur un hp-ux 11i avec un awk (pas gnu awk, vraiment que awk !)

    Voila mon problème : je dois transformer un script sed en script awk (bascule nécessaire car sed n'accepte pas les variables d'environnement dans ses scripts).

    J'ai tout transformé, sauf quelques lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     s/\(["\-]\)\(P\)\([AMSWX]\)\([A-Z]\)/\1I\3\4/g
     # Ressources : change tout les NAME="PS ou NAME="PM ou NAME="PX en NAME="IS ou NAME="IM ou NAME="IX
     s/\(QUANTITATIVE NAME=\"\)\(P\)\([MSX]\)/\1I\3/g
     s/\(CONTROLE NAME=\"\)\(P\)\([MSX]\)/\1I\3/g

    Il s'agit de faire des modifications dans des fichiers xml.

    La première ligne transforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <OUTCOND NAME="PXCLJ4304-PXCLJ43ZZ" ODATE="ODAT" SIGN="DEL" />
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <OUTCOND NAME="IXCLJ4304-IXCLJ43ZZ" ODATE="ODAT" SIGN="DEL" />
    La dernière ligne transforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <QUANTITATIVE NAME="PX-CLIPER-CL" QUANT="1" />
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <QUANTITATIVE NAME="IX-CLIPER-CL" QUANT="1" />
    Comme vous le remarquez, il s'agit de transformer les lettres P en I (sauf lorsque le P est au milieu du nom, cad : PXRP01 deviendra IXRP01)

    Quelqu'un à une idée ?

  2. #2
    Expert confirmé

    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
    Par défaut
    Salut,

    Citation Envoyé par herzleid Voir le message
    car sed n'accepte pas les variables d'environnement dans ses scripts).
    Euh... c'est à dire ? T'as un exemple ?

    Parce que sed peut travailler avec des variables, tout est histoire de quotes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo $HOME
    /home/jp
     
    $ echo $PWD
    /home/jp/trash
     
    $ echo $PWD | sed 's#'"${HOME}"'#TOTO#'
    TOTO/trash
    Comme vous le remarquez, il s'agit de transformer les lettres P en I (sauf lorsque le P est au milieu du nom, cad : PXRP01 deviendra IXRP01)
    Avec tes 2 exemples donnés, on peut réduire et simplifier ton expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo -e "$A\n$B" 
    QUANTITATIVE NAME="PX-CLIPER-CL" QUANT="1"
    OUTCOND NAME="PXCLJ4304-PXCLJ43ZZ" ODATE="ODAT" SIGN="DEL"
     
    $ echo -e "$A\n$B" | sed 's/\bP/I/g'
    QUANTITATIVE NAME="IX-CLIPER-CL" QUANT="1"
    OUTCOND NAME="IXCLJ4304-IXCLJ43ZZ" ODATE="ODAT" SIGN="DEL"

  3. #3
    Membre chevronné Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Par défaut
    Tout d'abord merci pour votre réponse.

    Citation Envoyé par zipe31 Voir le message
    Salut,


    Euh... c'est à dire ? T'as un exemple ?

    Parce que sed peut travailler avec des variables, tout est histoire de quotes...
    Pas lorsque l'on utilise un fichier de commande, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -f commandes.sed monfichier
    n'est pas reconnu sur mon hp-ux

  4. #4
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par herzleid Voir le message
    Pas lorsque l'on utilise un fichier de commande, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -f commandes.sed monfichier
    Effectivement je n'avais pas envisagé cette possibilité

    n'est pas reconnu sur mon hp-ux
    Oups
    Et comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo -e "$A\n$B" | sed 's/\(="\|-\)P/\1I/g'
    QUANTITATIVE NAME="IX-CLIPER-CL" QUANT="1"
    OUTCOND NAME="IXCLJ4304-IXCLJ43ZZ" ODATE="ODAT" SIGN="DEL"

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par herzleid Voir le message
    Pas lorsque l'on utilise un fichier de commande, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -f commandes.sed monfichier
    Si tu n'as pas beaucoup de variables dans ton fichier de commandes sed et que leurs valeurs ne contiennent pas trop de caractères spéciaux, tu peux les remplacer... avec 'sed', par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mv commandes.sed commandes.sed_orig
    cat commandes.sed_orig \
    | sed -e "s|\${var1}|${var1}|g" \
          -e "s|\${var2}|${var2}|g" \
    > commandes.sed
    sed -f commandes.sed monfichier
    Tu peux même supprimer l'uuoc...

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

    @jack-ft: le même principe en plus simple qui je pense devrait fonctionner ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -e "s|\${var1}|${var1}|g" \
    -e "s|\${var2}|${var2}|g" commandes.sed | sed -f - monfichier
    Pour ma culture personnelle, c'est quoi l'uuoc ?
    (le pire, c'est que je dois le savoir...)

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour ma culture personnelle, c'est quoi l'uuoc ?
    (le pire, c'est que je dois le savoir...)
    Première entrée sur Gogol
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 338
    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 338
    Par défaut
    Oui, je sais, j'ai été voir juste après et comme je disais, je le savais

  9. #9
    Membre chevronné Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Par défaut
    Merci à tous pour votre aide.

    Dans le désordre :
    La construction du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cat fic.sed|sed -f - IXCLJ43.xml
    sed: Cannot open pattern file -.
    Elle marche sous linux. HP-UX c'est vraiment un environnement contraignant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ echo -e "$A\n$B" | sed 's/\(="\|-\)P/\1I/g'
    QUANTITATIVE NAME="PX-CLIPER-CL" QUANT="1"
    OUTCOND NAME="PXCLJ4304-PXCLJ43ZZ" ODATE="ODAT" SIGN="DEL"
    idem, fonctionne sous linux et pas sur HP-UX ....

    La seule solution qui marche est de générer le script sed pour ensuite l'exécuter...
    En tout cas merci à tous.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 338
    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 338
    Par défaut
    Ok,
    Pour la version simplifier, comme on est censé être posix ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo -e "$A\n$B" | sed 's/\([^[:alpha:]]\)P/\1I/g'
    QUANTITATIVE NAME="IX-CLIPER-CL" QUANT="1"
    OUTCOND NAME="IXCLJ4304-IXCLJ43ZZ" ODATE="ODAT" SIGN="DEL"
    si tu peux avoir comme mot du TOTO9PTITI et que le P ici ne doit pas être changé en I, alors il suffit de remplacer "[:alpha:]" par "[:alnum:]" mais bon, faut déjà que cela fonctionne sous HP-UX

  11. #11
    Membre chevronné Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ok,
    Pour la version simplifier, comme on est censé être posix ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo -e "$A\n$B" | sed 's/\([^[:alpha:]]\)P/\1I/g'
    QUANTITATIVE NAME="IX-CLIPER-CL" QUANT="1"
    OUTCOND NAME="IXCLJ4304-IXCLJ43ZZ" ODATE="ODAT" SIGN="DEL"
    si tu peux avoir comme mot du TOTO9PTITI et que le P ici ne doit pas être changé en I, alors il suffit de remplacer "[:alpha:]" par "[:alnum:]" mais bon, faut déjà que cela fonctionne sous HP-UX

    ça marche !!!!

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

Discussions similaires

  1. Petit souci AWK et REGEX
    Par DIE dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 19/12/2007, 22h09
  2. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55
  3. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  4. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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