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 :

Substitution dans un shell d'une chaîne dans un fichier.


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 1
    Par défaut Substitution dans un shell d'une chaîne dans un fichier.
    Bonjour,

    J'ai le fichier texte suivant en entrée:
    ---
    <NUMERO>0</NUMERO>
    <ACQUISITION>TEST</ACQUISITION>
    <DATE>2001-12-17T09:30:47.0</DATE>
    <DIRECTION>DESCENDANT</DIRECTION>
    ---

    Il y a des tabulations avant chaque <TAG>.

    En utilisant un shell ksh, je souhaite remplacer la date qui se trouve entre les tags <DATE> et </DATE> par une autre date, sachant que la date en entrée n'est pas toujours la même.

    Est-ce que vous connaissez une commande simple qui fonctionne dans un shell?

    Merci.

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

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

    tu devrais avoir de la doc ici ou
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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
    francois@francois-laptop:~$ echo "<date>"$(date +%Y%m%d)"</date>" | sed "s/\(<date>\).*\(<\/date>\)/\1"$variable"\2/"
    <date></date>
    francois@francois-laptop:~$ variable=toto
    francois@francois-laptop:~$ echo "<date>"$(date +%Y%m%d)"</date>" | sed "s/\(<date>\).*\(<\/date>\)/\1"$variable"\2/"
    <date>toto</date>
    francois@francois-laptop:~$
    très concrètement ça marche comme ça :
    substitute / (<date>)_conservé (.*)suivi_de_n'importe_quoi (</date>)_conservé / \premier_conservé $variable_chaine_remplacement \deuxième_conservé /

    comment l'exploiter dans le cas d'un fichier ?
    tout simplement avec la fonction d'enregistrement de sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    variable=chaine_de_remplacement
    sed -i "s/\(<date>\).*\(<\/date>\)/\1"$variable"\2/" fichier

    et enfin si tu as plusieurs occurrences dans un même fichier à traiter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in $(grep "<numero" fichier) ; do
    numero=$(echo $i | grep "[0-9]")
    variable=chaine_remplacement
    sed -i "/<numero>"${numero}"/,/<\/direction>/s/\(<date>\).*\(<\/date>\)/\1"$variable"\2/" fichier
    if [ $? -eq 0 ] ; then echo "occurance n° "${numero}" traitée avec succès" 
    else echo "occurance n° "${numero}" non traitée" ; fi
    done
    comme ça, ça traite chaque paragraphes allant de "<numero>" à "</direction>" indépendamment, ce qui peut aussi avoir l'avantage de regenerer une variable de remplacement différente à chaque fois si on veut...

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Une autre manière de faire, ce petit script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk -F '<[/]?DATE>' -v old=$1 -v new=$2 '{if ($2 == old) sub(old, new); print}' $3 > $3.tmp
    mv $3.tmp $3
    Et pour l'appeler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./nom_script nom_fichier ancienne_date nouvelle_date

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2010, 12h45
  2. Recuperation d'une chaîne dans un fichier
    Par black is beautiful dans le forum Windows
    Réponses: 3
    Dernier message: 20/03/2006, 18h57
  3. Shell - Récupérer une variable dans un autre fichier
    Par claralavraie dans le forum Linux
    Réponses: 9
    Dernier message: 11/01/2006, 16h25
  4. [DOM] agir sur le DOM au changement d'une chaîne dans un FORM
    Par boteha dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 30/11/2005, 14h39
  5. Réponses: 5
    Dernier message: 21/07/2005, 19h20

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