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 :

Remplacer le deuxième champ par une chaine


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 40
    Par défaut Remplacer le deuxième champ par une chaine
    Bonjour,
    j'espère que vous allez tous très bien,

    j'ai un document texte qui contient des lignes et des champs qui sont séparer par un ; (point_virgule).

    je veux par exemple toujours remplacer le deuxième champs par une chaine "name".sachant que le seuxième champs n'a pas une valeur fixe.
    l'exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GF3423;1425431;7652;0;20;HGR454
    YTU426;1865413;7659;0;20;HGR874
    GFHG23;1872578;7872;0;20;HGY754
    YTU428;1945324;76999;0;20;HGI897
    Merci pour votre aide

  2. #2
    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
    Qu'as-tu déjà essayé ?
    Quel problème rencontres-tu ?
    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.

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 40
    Par défaut
    ce que je connais moi c'est la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/2431532/toto/g' > file.txt
    qui remplace 2431532 par toto mais ce que ne connais pas c'est comment lui préciser le deuxièmr champs sans qu'il prenne en concidération sa valeur

  4. #4
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 40
    Par défaut
    Bonjour
    j'ai trouver la réponse la voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/;[^;]*/;name/' fichier.txt

  5. #5
    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 mond14 Voir le message
    Bonjour
    j'ai trouver la réponse la voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/;[^;]*/;name/' fichier.txt
    Une solution peut être plus souple... sed 's/[^;]*/name/2'

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    pour manipuler des fichiers CSV, awk me semble être un outil plus approprié.

    il est peut-être un peu lourd pour des petits traitements comme celui-ci, mais plus simple que sed quand ce sera plus compliqué.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    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 N_BaH Voir le message
    pour manipuler des fichiers CSV, awk me semble être un outil plus approprié.

    il est peut-être un peu lourd pour des petits traitements comme celui-ci, mais plus simple que sed quand ce sera plus compliqué.
    C'est clair

    J'allais dire pour la défense de "sed" que son option "in-place" était un atout majeur quand il faut modifier les fichiers, mais avec la nouvelle mouture de awk (4.1.0) s'en est fini de l'hégémonie de sed dans ce domaine et c'est tant mieux

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

    Je sents un petit reproche sur la petite remarque que j'ai fait sur le post http://www.developpez.net/forums/d13...st-egale-a-13/
    Donc, je tiens à préciser que ici que je m'étais plus en avant grep que sed étant donné le problème, après pour faire du replace, personnellement je préfère sed.
    après, avant de décider quel commande est la plus à même de faire le travail, il faudrait déjà avoir le problème dans son ensemble.
    Comme ici, par exemple, on pourrait tout faire en builtin avec un while sur un read -d\; , un set sur la ligne, et un echo
    puis, qui dis sed et/ou awk, peut dire perl qui bien souvent est plus rapide

    Ok, je sors

    PS: Je plaisante, c'est juste un peu de provoc

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,


    Une solution peut être plus souple... sed 's/[^;]*/name/2'
    Euh.. Cette solution échange deux fois, non? Donc le champ 1 et le champ 2. Il me semblait que seul le champ 2 devait changer.

  10. #10
    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 Flodelarab Voir le message
    Euh.. Cette solution échange deux fois, non? Donc le champ 1 et le champ 2. Il me semblait que seul le champ 2 devait changer.
    Euh... non, cette solution échange uniquement le second motif matchant la regex.

    Démonstration...

    Fichier de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat plop 
    GF3423;1425431;7652;0;20;HGR454
    YTU426;1865413;7659;0;20;HGR874
    GFHG23;1872578;7872;0;20;HGY754
    YTU428;1945324;76999;0;20;HGI897
    Substitution 2nd motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed 's/[^;]*/name/2' plop 
    GF3423;name;7652;0;20;HGR454
    YTU426;name;7659;0;20;HGR874
    GFHG23;name;7872;0;20;HGY754
    YTU428;name;76999;0;20;HGI897
    Substitution 3e motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed 's/[^;]*/name/3' plop 
    GF3423;1425431;name;0;20;HGR454
    YTU426;1865413;name;0;20;HGR874
    GFHG23;1872578;name;0;20;HGY754
    YTU428;1945324;name;0;20;HGI897
    Édit : Et pour faire joujou...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed '1{s/[^;]*/name/};2{s/[^;]*/name/2};3{s/[^;]*/name/3};4{s/[^;]*/name/4}' plop 
    name;1425431;7652;0;20;HGR454
    YTU426;name;7659;0;20;HGR874
    GFHG23;1872578;name;0;20;HGY754
    YTU428;1945324;76999;name;20;HGI897

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

Discussions similaires

  1. remplacement d'un caractere par une chaine
    Par kayenne77 dans le forum Langage
    Réponses: 3
    Dernier message: 06/07/2009, 05h13
  2. Réponses: 2
    Dernier message: 03/04/2008, 16h05
  3. [VBA] remplacer null par une chaine de caractère
    Par Bernard123 dans le forum VBA Access
    Réponses: 8
    Dernier message: 20/04/2007, 16h35
  4. Comment remplacer le nom d'un controle par une chaine ?
    Par roico dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/04/2007, 11h49
  5. Réponses: 3
    Dernier message: 05/01/2007, 15h50

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