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 :

Copier des données d'un fichier vers un autre sans écraser le second


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Copier des données d'un fichier vers un autre sans écraser le second
    Bonjour,

    J'ai le fichier.txt contenant les information suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<Test TestId="0001" TestType="CMD">
        <Name>Convert number to string</Name>
        <CommandLine>Examp1.EXE</CommandLine>
        <Input>1</Input>
        <Output>One</Output>
    je souhaite copier cet morceau de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0"?>
    <Tests>
    à la première ligne de mon fichier.txt sans écraser son contenu et faire de même pour à la derniere ligne du fichier.txt.

    Merci de votre aide !

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 262
    Points : 13 518
    Points
    13 518
    Par défaut
    Salut

    Imaginons que tes fichiers s'appellent corps.txt, entete.txt, fin.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat entete.txt corps.txt fin.txt >resultat.txt

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

    Le fichier d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat brol 
    	<Test TestId="0001" TestType="CMD">
        <Name>Convert number to string</Name>
        <CommandLine>Examp1.EXE</CommandLine>
        <Input>1</Input>
        <Output>One</Output>
    Le script "sed" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat script.sed 
    1 {
    i\
    <?xml version="1.0"?>\
    <Tests>
    }
    $ {
    a\
        </Test>\
    </Tests>
    }
    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -i.bak -f script.sed brol
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat brol 
    <?xml version="1.0"?>
    <Tests>
    	<Test TestId="0001" TestType="CMD">
        <Name>Convert number to string</Name>
        <CommandLine>Examp1.EXE</CommandLine>
        <Input>1</Input>
        <Output>One</Output>
        </Test>
    </Tests>

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Puisque chacun a décidé de mettre sa petite solution, on va y aller en shell. et comme j'ai l'impression qu'il faudra le faire pour un paquet de fichiers (parce que si c'était pour un il aurait pu le faire avec "vi"), on va prévoir une boucle...
    Code bash : 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
    #!/bin/bash
    for file in $*
    do
        echo "Traitement $file"
     
        exec 3<"$file"
        rm -f "$file"
     
        (
            cat <<_EOT_
    <?xml version="1.0"?>
    <Tests>
    _EOT_
     
          cat 0<&3
     
          cat <<_EOT_
        </Test>
    </Tests>
    _EOT
     
        ) > "$file"
    done

  5. #5
    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 Sve@r Voir le message
    et comme j'ai l'impression qu'il faudra le faire pour un paquet de fichiers (parce que si c'était pour un il aurait pu le faire avec "vi"), on va prévoir une boucle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -f script.sed fich*

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -f script.sed fich*
    Plus je vois ce que tu fais, plus je me dis que je devrais approfondir mon sed...

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 262
    Points : 13 518
    Points
    13 518
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in `seq 13`; do cat "entete"$i".txt" "corps"$i".txt" "fin"$i".txt" >"resultat"$i".txt";done


    [PS]
    $ man woman
    Il n'y a pas de page de manuel pour woman.
    Ohohoho

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ man les\ femmes
    Aucune entrée de manuel pour les femmes
    Mon ordi confirme.
    [/PS]

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci à vous tous pour vos réponses !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    un peu tard :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exec {foo}<"$file"
    rm -f "$file"
    echo "<?xml version=\"1.0\"?>
    <Tests>
    $(</proc/$$/fd/$foo)
        </Test>
    </Tests>" > "$file"
    exec {foo}<&-

  10. #10
    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 851
    Points
    5 851
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    un peu tard :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exec {foo}<"$file"
    rm -f "$file"
    echo "<?xml version=\"1.0\"?>
    <Tests>
    $(</proc/$$/fd/$foo)
        </Test>
    </Tests>" > "$file"
    exec {foo}<&-
    J'ai beau me dire que ça marche probablement (surtout si le 'exec' rend un status 0...), ça me fout quand même un peu les jetons de voir un rm -f "$file" à la 2ème ligne du script...
    J'avoue que j'aurais un peu de mal à virer comme ça sans état d'âme mon fichier d'entrée...
    C'est que j'y tiens, moi, à mon fichier d'entrée...

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    J'ai beau me dire que ça marche probablement (surtout si le 'exec' rend un status 0...), ça me fout quand même un peu les jetons de voir un rm -f "$file" à la 2ème ligne du script...
    J'avoue que j'aurais un peu de mal à virer comme ça sans état d'âme mon fichier d'entrée...
    C'est malheureusement une obligation (ce rm y est aussi dans mon premier script). On crée un canal artificiel relié au fichier puis on le supprime.

    Le problème c'est que le shell commence avant toute chose par vider les fichiers concernés par une redirection (> "$file"). Et donc si tu ne supprimes pas le fichier en question, alors la redirection le vide ce qui vide alors par ricochet le canal qui lui est associé !!!
    Tandis que si le fichier est effacé, le système le détache du canal. Ensuite le canal reste dispo pour être traité et la redirection crée un nouveau fichier.

    Bien évidemment, une faille entre le rm et sa recréation complète par le traitement des datas du canal et paf le fichier...

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

Discussions similaires

  1. [XL-2007] Copier des données d'une feuille vers une autre feuille
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/12/2011, 12h08
  2. copier des données d'une table vers une autre
    Par shaftJackson dans le forum PL/SQL
    Réponses: 2
    Dernier message: 02/04/2009, 16h34
  3. copier des données d'un classeur vers un autre
    Par jackall dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 01/08/2008, 17h20
  4. Réponses: 12
    Dernier message: 09/06/2008, 17h54
  5. Réponses: 2
    Dernier message: 19/04/2007, 13h54

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