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 :

sed : exécuter une commande


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 7
    Points : 0
    Points
    0
    Par défaut sed : exécuter une commande
    Bonjour,

    Dans un fichier texte, il y a des tags de dates du type: DOD-n ou DOD+m
    où n et m sont variables et représentent un delta négatif ou positif par rapport à la date du jour (Date of the day)

    J'aimerais utiliser SED pour les transformer en: YYYY-MM-DD par rapport à la date system lors de l'execution du script.

    Linux : date -d 'x day' +%F est la commande qui va bien
    avec 'x' comme valeur numérique (négatif, positive ou nulle)

    mais voilà ce qui ne marche pas avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/DOD\([+-][0-9]*\)/`date -d '\1 day' +%F`/g" filename
    par contre ce qui fonctionne (sans partie variable) et qui n'est pas très loin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/DOD\([+-][0-9]*\)/`date -d '10 day' +%F`/g" filename
    Quelqu'un peut m'aider Merci

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

    C'est tout bonnement impossible avec sed

    La syntaxe exacte avec sed pour ce genre de remplacement se fait grâce au flag "e" et permet d'effectuer un remplacement de la ligne entière contenant le motif, motif qui doit lui aussi ciblé une ligne entière et non une partie de celle-ci.

    Par exemple : sed 's/.*DOD.*/date +%F/e' fichier remplacera toute la/les ligne(s) contenant "DOD" par la date du jour au format demandé.
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 7
    Points : 0
    Points
    0
    Par défaut
    Merci zipe31 pour tes explications

    J'ai fais ça qui fonctionne bien mais c'est verbeux, limité et lent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    sed \
              -e "s/'DOD-0020'/`date -d '-20 day' +%F`/g" \
              -e "s/'DOD-0019'/`date -d '-19 day' +%F`/g" \
              -e "s/'DOD-0018'/`date -d '-18 day' +%F`/g" \
              -e "s/'DOD-0017'/`date -d '-17 day' +%F`/g" \
              -e "s/'DOD-0016'/`date -d '-16 day' +%F`/g" \
              -e "s/'DOD-0015'/`date -d '-15 day' +%F`/g" \
              -e "s/'DOD-0014'/`date -d '-14 day' +%F`/g" \
              -e "s/'DOD-0013'/`date -d '-13 day' +%F`/g" \
              -e "s/'DOD-0012'/`date -d '-12 day' +%F`/g" \
              -e "s/'DOD-0011'/`date -d '-11 day' +%F`/g" \
              -e "s/'DOD-0010'/`date -d '-10 day' +%F`/g" \
              -e "s/'DOD-0009'/`date -d '-9 day' +%F`/g" \
              -e "s/'DOD-0008'/`date -d '-8 day' +%F`/g" \
              -e "s/'DOD-0007'/`date -d '-7 day' +%F`/g" \
              -e "s/'DOD-0006'/`date -d '-6 day' +%F`/g" \
              -e "s/'DOD-0005'/`date -d '-5 day' +%F`/g" \
              -e "s/'DOD-0004'/`date -d '-4 day' +%F`/g" \
              -e "s/'DOD-0003'/`date -d '-3 day' +%F`/g" \
              -e "s/'DOD-0002'/`date -d '-2 day' +%F`/g" \
              -e "s/'DOD-0001'/`date -d '-1 day' +%F`/g" \
              -e "s/'DOD-0000'/`date -d '-0 day' +%F`/g" \
              -e "s/'DOD+0000'/`date -d '-0 day' +%F`/g" \
              -e "s/'DOD+0001'/`date -d '+1 day' +%F`/g" \
              -e "s/'DOD+0002'/`date -d '+2 day' +%F`/g" \
              -e "s/'DOD+0003'/`date -d '+3 day' +%F`/g" \
              -e "s/'DOD+0004'/`date -d '+4 day' +%F`/g" \
              -e "s/'DOD+0005'/`date -d '+5 day' +%F`/g" \
              -e "s/'DOD+0006'/`date -d '+6 day' +%F`/g" \
              -e "s/'DOD+0007'/`date -d '+7 day' +%F`/g" \
              -e "s/'DOD+0008'/`date -d '+8 day' +%F`/g" \
              -e "s/'DOD+0009'/`date -d '+9 day' +%F`/g" \
              -e "s/'DOD+0010'/`date -d '+10 day' +%F`/g" \
              -e "s/'DOD+0011'/`date -d '+11 day' +%F`/g" \
              -e "s/'DOD+0012'/`date -d '+12 day' +%F`/g" \
              -e "s/'DOD+0013'/`date -d '+13 day' +%F`/g" \
              -e "s/'DOD+0014'/`date -d '+14 day' +%F`/g" \
              -e "s/'DOD+0015'/`date -d '+15 day' +%F`/g" \
              -e "s/'DOD+0016'/`date -d '+16 day' +%F`/g" \
              -e "s/'DOD+0017'/`date -d '+17 day' +%F`/g" \
              -e "s/'DOD+0018'/`date -d '+18 day' +%F`/g" \
              -e "s/'DOD+0019'/`date -d '+19 day' +%F`/g" \
              -e "s/'DOD+0020'/`date -d '+20 day' +%F`/g" \
              $file > ./$filename

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    C'est tout bonnement impossible avec sed
    mais jouable avec awk (nawk si Solaris):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    awk '/DOD[+-][0-9]*/ {
      i=match($0,/DOD[+-][0-9]*/);
      d=substr($0,i+3,RLENGTH-3);
      command=sprintf("date -d \"%s day\" +%%F",d);
      command | getline foo
      close(command)
      gsub(/DOD[+-][0-9]*/,foo)
      print
      }
    ' filename
    ɹǝsn *sıɹɐlos*

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 7
    Points : 0
    Points
    0
    Par défaut
    Merci encore zipe31,

    Effectivement, ce script s'exécute rapidement et awk parait bien adapté

    Est-il possible d'apporter 2 évolutions :
    - il existe 2 tags distincts par ligne : dans ce cas le calcul du premier tag s'applique au 2ieme et e n'est pas correct
    - les lignes dans lesquelles les tags ne sont pas présents doivent s'afficher

    Merci

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par jcg2a Voir le message
    Merci encore zipe31
    de rien, mais moi c'est jlliagre ...
    Est-il possible d'apporter 2 évolutions :
    - il existe 2 tags distincts par ligne : dans ce cas le calcul du premier tag s'applique au 2ieme et e n'est pas correct
    - les lignes dans lesquelles les tags ne sont pas présents doivent s'afficher
    Pour les deux tags distincts, un exemple de ligne fournie en entrée et le résultat souhaité serait plus clair.
    ɹǝsn *sıɹɐlos*

  7. #7
    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 jlliagre Voir le message
    de rien, mais moi c'est jlliagre ...
    Rendons donc à jlliagre ce qui appartient à jlliagre...

    Merci² jlliagre
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 298
    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 298
    Points : 12 778
    Points
    12 778
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    C'est tout bonnement impossible avec sed

    La syntaxe exacte avec sed pour ce genre de remplacement se fait grâce au flag "e" et permet d'effectuer un remplacement de la ligne entière contenant le motif, motif qui doit lui aussi ciblé une ligne entière et non une partie de celle-ci.

    Par exemple : sed 's/.*DOD.*/date +%F/e' fichier remplacera toute la/les ligne(s) contenant "DOD" par la date du jour au format demandé.
    Bonjour,
    Sous linux, la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo DOD-25xxx | sed 's/.*DOD\([+-][0-9]*\)/date -d "\1 day\" +%F/e'
    retourne:
    Cordialement.
    Cordialement.

  9. #9
    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
    Sous linux, la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo DOD-25xxx | sed 's/.*DOD\([+-][0-9]*\)/date -d "\1 day\" +%F/e'
    retourne:
    Oui, à condition que le motif soit en début de ligne, sans quoi, ça merdoie un petit peu

    Exemple de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat brol 
    09GT-000011AFTLD2C DOD-13DOD+5NY212123YY654321777777
    09GT-000011AFTLD2C DOD+109999-12-31NY212123YY654321777777
    DOD-13DOD+5NY212123YY654321777777
    DOD+109999-12-31NY212123YY654321777777
    Avec ta syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed 's/.*DOD\([+-][0-9]*\)/date -d "\1 day\" +%F/e' brol 
    2013-02-03NY212123YY654321777777
    2314-04-01-12-31NY212123YY654321777777
    2013-02-03NY212123YY654321777777
    2314-04-01-12-31NY212123YY654321777777
    En ciblant que depuis le début du motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ sed 's/DOD\([+-][0-9]*\)/date -d "\1 day\" +%F/e' brol 
    sh: 1: 09GT-000011AFTLD2C: not found
     
    sh: 1: 09GT-000011AFTLD2C: not found
     
    2013-01-16DOD+5NY212123YY654321777777
    2314-04-01-12-31NY212123YY654321777777
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

    Dans le cas ou le motif n'est pas en début de ligne, on peut faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo yyyDOD-25xxx | sed 's/\(.*\)DOD\([+-][0-9]*\)/echo -n "\1";date -d "\2 day\" +%F/e'
    yyy2013-01-04xxx
    Cordialement.
    Cordialement.

  11. #11
    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
    Dans le cas ou le motif n'est pas en début de ligne, on peut faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo yyyDOD-25xxx | sed 's/\(.*\)DOD\([+-][0-9]*\)/echo -n "\1";date -d "\2 day\" +%F/e'
    yyy2013-01-04xxx
    Merci bien
    $ man woman
    Il n'y a pas de page de manuel pour woman.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/02/2006, 12h43
  2. [Run]Exécuter une commande paramétrable
    Par nice dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/01/2006, 14h27
  3. exécuter une commande de logiciel
    Par MrsFrizz dans le forum C
    Réponses: 4
    Dernier message: 17/01/2006, 10h48
  4. exécuter une commande système à partir de sqlplus?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 24
    Dernier message: 08/11/2005, 15h11
  5. Exécuter une commande linux.
    Par casafa dans le forum Linux
    Réponses: 4
    Dernier message: 20/07/2005, 23h13

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