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 :

comment remplacer une chaîne par une autre


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut comment remplacer une chaîne par une autre
    Bonjour,

    J'ai des programme que je dois modifier.
    Vu leur nombre important, je voudrais automatiser la modification.

    dans les programmes on peut trouver les motifs suivants:

    detail.x
    day.x
    week.x
    year.x

    avec x est une chaîne de quelques caractères sans blanc.

    la modif que je voudrais faire:

    detail.x => agr.x_detail
    day.x => agr.x_day
    week.x => agr.x_week
    year.x => agr.x_year


    Exemple:

    Si je trouve detail.tabe je le remplace par agr.table_detail

    A noter que les mots detail, day, week et year peuvent être en minuscule ou majuscule.

    Quelqu’un sait-il comment faire ça avec une commande UNIX (genre sed ou awk ou autre qui marche sous AIX) ?

    Sidi

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <stp2>/tmp) sed "s/\(.*\).x/\1.x => arg.x_\1/" t
    detail.x => arg.x_detail
    day.x => arg.x_day
    week.x => arg.x_week
    year.x => arg.x_year
    <stp2>/tmp) uname -a
    AIX stp2 3 4 000000244C00
    <stp2>/tmp)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <stp2>/tmp) sed "s/\(.*\).x/\1.x => arg.x_\1/" tmaj
    detail.x => arg.x_detail
    DAY.x => arg.x_DAY
    week.x => arg.x_week
    year.x => arg.x_year
    <stp2>/tmp)

  3. #3
    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,

    Je partirai davantage sur deux références arrières comme sed 's/\([^.]*\)\(.*\)/agr\2_\1/' dans la mesure où le "x" est une inconnue

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Je partirai davantage sur deux références arrières comme sed 's/\([^.]*\)\(.*\)/agr\2_\1/' dans la mesure où le "x" est une inconnue
    bien vu

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Je partirai davantage sur deux références arrières comme sed 's/\([^.]*\)\(.*\)/agr\2_\1/' dans la mesure où le "x" est une inconnue
    Bonjour,

    Merci pour votre réponse, ça l'air pas mal, je confirme que x est bien variable.

    Par contre pouvez-vous m'expliquer ce que fait la commande ?

    Je ne veux pas appliquer la modif sur tous les motifs x.y, juste pour x dans detail, day, month, week ou year (en majuscule ou minuscule).

    Merci

  6. #6
    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
    Un motif placé entre parenthèses (protégées) définit une référence arrière que l'on peut rappeler par la suite par le numéro correspondant à son ordre d'apparition.

    Dans ton cas le motif recherché correspond à une suite de caractères commençant en début de ligne, suivi par un point et suivi d'une autre suite de caractères.

    \([^.]*\) Il nous faut isoler dans une référence arrière la 1ère partie jusqu'au point, hormis le point lui-même '[^.]*'

    \(.*\) La seconde référence arrière se contente d'englober tout de ce qui reste sur la ligne.

    agr\2_\1 Il ne reste plus qu'à assembler le tout dans le bon ordre avec les numéros (protégés) correspondants aux références arrières et en y rajoutant les motifs "agr" et l'underscore "_".


    Dans l'exemple qui suit, j'ai juste rajouté le fait de cibler uniquement les motifs "detail, day, month, week ou year (en majuscule ou minuscule)", ce qui se traduit par.

    /motif1\|motif2/ On recherche le motif1 OU le motif2, le \| indiquant un OU. Le ^ en début indiquant que le motif doit se trouver en début de ligne et les parenthèses permettent ici de regrouper l'ensemble des motifs et de les associer au paramètre de début de ligne.

    Le fichier de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat plop 
    detail.blabla
    détail.blabla
    day.blibli
    jour.blibli
    week.blublu
    semaine.blublu
    year.bloblo
    année.bloblo
    DAY.blabla
    La syntaxe et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed '/^\(detail\|day\|month\|week\|year\|DETAIL\|DAY\|MONTH\|WEEK\|YEAR\)/s/\([^.]*\)\(.*\)/agr\2_\1/' plop 
    agr.blabla_detail
    détail.blabla
    agr.blibli_day
    jour.blibli
    agr.blublu_week
    semaine.blublu
    agr.bloblo_year
    année.bloblo
    agr.blabla_DAY

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut
    Bonjour,
    Merci pour ces explications, je vais donner plus de précision.

    Dans ton cas le motif recherché correspond à une suite de caractères commençant en début de ligne, suivi par un point et suivi d'une autre suite de caractères.
    Le motif recherché peut commencer de n'importe quelle position sur la ligne:
    début de la ligne, après un blanc ou après un caractère spécial ('/'), dans ce cas là le blanc ou le caractère spécial ne doit pas être considéré comme parti du motif.
    En plus le premier motif peut être detail, day, week, month ou year (en minuscule ou majuscule ou mélange des deux).


    \(.*\) La seconde référence arrière se contente d'englober tout de ce qui reste sur la ligne.
    Le deuxième motif ne doit pas englober tout le reste de la ligne, elle s'arrête des que on rencontre un blanc ou un caractère spécial genre '(' ou '/' ou ';').

    par exemple si en entrée j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data test;
    set detail.blabla;
     set day.blibli ; /*lecture de blibli*/
    set /*commentaire*/week.bloblo(where id=1);
    set /*commentaire*/ week.bloblo(where id=1);
    run;
    Je souhaite avoir ça en sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data test;
    set agr.blabla_detail;
     set agr.blibli_day ; /*lecture de blibli*/
    set /*commentaire*/agr.bloblo_week(where id=1);
    set /*commentaire*/ agr.bloblo_week(where id=1);
    run;

    En fait detail, day,etc. ces sont des noms de bibliothèques, qui est devenu agr.
    Et blabla, blibli représentent les noms des table dans la base de données.

    day.blabla : c'est la table blabla au niveau day qui est devenue la table blabla_day de la bibliothèque agr (agr.blabla_day).


    Merci pour votre aide

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

Discussions similaires

  1. [VB.NET] Remplacer une chaîne par une autre, une seule fois
    Par RobinSoft dans le forum Débuter
    Réponses: 1
    Dernier message: 22/02/2013, 23h19
  2. Réponses: 0
    Dernier message: 04/03/2011, 13h16
  3. [regexp] Remplacer une chaîne par une chaîne aléatoire
    Par endreillie dans le forum Langage
    Réponses: 9
    Dernier message: 28/10/2010, 13h15
  4. Remplacer une chaîne par une autre plus petite
    Par qqoos dans le forum Cobol
    Réponses: 6
    Dernier message: 08/05/2009, 19h24
  5. Réponses: 1
    Dernier message: 06/08/2007, 15h20

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