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 :

SED - Manipulation et substitution d'une ligne


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut SED - Manipulation et substitution d'une ligne
    Bonjour à tous,

    Je suis à la recherche de la ligne de commande sed (ou autre commande) me permettant d'effectuer des substitutions sur une ligne.
    Le mieux est de montrer un exemple parlant.

    J'ai une ligne qui "peut ressembler" à ça:

    condition: v(IESCL0P01-ACTIVE) = "YES" & s(IESCL0P01-Q2COP01-FRA_ENRICHIR_LETTRE_ACCUEIL-ENR-CP_MSG_0010) & s(IPSMTECHFRAP01-M2WAEP01-NC01_EXPL-LANC-S00VL9941P01791)

    Mon but est de remplacer les chaînes P01 (en rouge) par H11 mais pas le reste des P01 (en vert).

    Je ne suis pas expert sed, je ne connais que les commandes de bases, du coup le sed -e 's/P01-/H11-/g ne fonctionne pas du tout pour ce que je souhaite effectuer.
    Une info qui pourrait peut être servir, les caractères que je peux trouver après les P01- à modifier (en rouge donc) sont [QHMTARVC].

    Quelqu'un aurait il un idée pour m'aider?
    Je chercher sur le net depuis hier (peut être mal) et je ne trouve pas de solution.

    Merci à vous.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 108
    Points : 28 420
    Points
    28 420
    Par défaut
    Si tu as bien identifié ce que tu veux modifier et ce qui ne doit pas l'être, cela devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/P01-\([QHMTARVC]\)/H11-\1/g'

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup al1_24, la commande fait parfaitement le taf par rapport à ce que j'avais indiqué.

    Sauf que j'ai oublié des cas possibles ...

    Je peux renconter ce genre de chose (exceptions en bleues dans le texte):

    condition: v(IESCL0P01-ACTIVE) = "YES" & v(IAUTO6P01-LIVRAISON) = "NO" & s(IESCL0P01-Q2COP01-MAR_ENRICHIR_LETTRE_ACCUEIL-ENR-CP_MSG_0010) & s(IPSMTECHFRAP01-M2WAEP01-NC01_EXPL-LANC-S00VL9941P01791)

    D'ailleurs, à la place de MAR (ce sont des codes pays), je peux avoir des choses comme ANT, MEX, RUS ..

    Du coup je rebloque

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

    Ton but ne serait pas plutôt de remplacer le premier P01 de chaque bloc entre parenthèse (c'est le cas dans l'exemple que tu donnes) ?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour disedorgue,

    C'est exactement ça quand j'y réfléchis.
    Ca fait du bien d'avoir un point de vue extérieur.

    Si tu as une idée de syntaxe, je suis preneur car là, franchement je nage ...

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    La regex en perl est plus simple car on peut inhiber la gourmandise des '*' ou '+' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pe 's/(\(.+?)P01/$1H11/g'

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Que dire, à part un grand merci !!!!!!!

    Ca fonctionne nickel.

    Pourrais tu m'expliquer la syntaxe ? A l'image du sed, si je ne me trompe pas, il s'agit d'une expression régulière mais je n'arrive pas à la saisir.

    En tout cas, encore merci à toi et al1_24

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Oui, j'ai volontairement utilisé une syntaxe qui ressemble à du sed, donc pour (\(.+?)P01:
    (....) => permet de faire une capture en tant qu'argument afin que cela soit réutilisé par la suite, ici, comme on n'en a qu'une, on n'aura qu'un seul argument qui se nommera en perl $1 (équivalent du \1 de sed).
    \(.+?P01 => \( recherche une parenthèse ouvrante .+ au moins un caractère (quelconque) ?P01 on arrête de faire la recherche du .+ dés que l'on rencontre P01 (c'est cette partie là que ne sait pas faire le sed).
    Ici, c'est pour l'explication, le +? ou *? sont insécables pour inhiber la gourmandise de + ou *.

    Bon, j'espère que l'explication est assez claire

  9. #9
    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
    Points : 5 849
    Points
    5 849
    Par défaut
    Apparemment, le bout de chaine entre la parenthèse ouvrante "(" et le premier "P01" est constitué de lettres majuscules et éventuellement du zéro, mais ne contient pas le "séparateur" (le tiret "-").

    Si c'est bien le cas, "sed" doit pouvoir le faire, malgré sa gourmandise!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo ' condition: v(IESCL0P01-ACTIVE) = "YES" & s(IESCL0P01-Q2COP01-FRA_ENRICHIR_LETTRE_ACCUEIL-ENR-CP_MSG_0010) & s(IPSMTECHFRAP01-M2WAEP01-NC01_EXPL-LANC-S00VL9941P01791)' \
    | sed -e 's/\(([A-Z0]*\)P01/\1H11/g'
    =>  condition: v(IESCL0H11-ACTIVE) = "YES" & s(IESCL0H11-Q2COP01-FRA_ENRICHIR_LETTRE_ACCUEIL-ENR-CP_MSG_0010) & s(IPSMTECHFRAH11-M2WAEP01-NC01_EXPL-LANC-S00VL9941P01791)

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Oui, je sais, mais j'ai jamais dis que ce n'était pas possible en sed...

    J'avais aussi celle-ci sous le coude:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\(([^-]*\)P01/\1H11/g'
    Mais elle ne respecte pas vraiment la règle identifiée...
    Allez, posons la question: comment faire en sed (le plus simplement possible) la règle identifiée:
    Dans chaque bloc encadré par des parenthèses, ne modifier que le premier P01 rencontré par H11.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    le plus simplement possible ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/P01/\n/g;s/(/\n(/g;s/\(([^\n]*\n\)/\1H11/g;s/\nH11/H11/g;s/\n(/(/g;s/\n/P01/g'
    ça a l'air de le faire.
    Cordialement.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Pas mal, mais on peut faire mieux...
    Perso, je l'ai en 3 replace (ton premier et ton dernier) et une seule entre les 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/P01/\n/g;s/\(([^\n]*\)\n/\1H11/g;s/\n/P01/g'
    Pour l'instant, j'ai pas trouvé mieux...

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/12/2008, 17h49
  2. sed: remplacer une ligne qui commence par Version
    Par lili2704 dans le forum Linux
    Réponses: 8
    Dernier message: 21/07/2008, 14h26
  3. Suppression d'une ligne en shell ' sed' ou 'head'
    Par Findly dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 04/01/2008, 14h12
  4. Insérer une ligne avec sed
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 28/06/2007, 14h08
  5. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 09h34

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