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 un certain nombre de lignes d'un fichier vers un autre fichier


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Copier un certain nombre de lignes d'un fichier vers un autre fichier
    Bonjour,

    Dans mon script shell (#!/bin/sh), je voudrais recopier les lignes numéro 3 à numéro 20 du script shell lui même qui est exécuté dans les lignes 3 à 20 d'un autre fichier.
    Je pensais faire ça avec la commande sed.
    Par exemple, je sais que la commande :
    sed -i "3,20 c\toto" file permet d'écrire la chaîne toto dans le fichier file sur les lignes 3 à 20.
    Mais après je bloque...

    Si quelqu'un a une idée...
    Merci d'avance

  2. #2
    Membre éclairé 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 : 60
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonsoir,

    Voici ce que j'ai compris:

    • fichier source src_1.
    • fichier source src_2.
    • fichier destination dst = lignes 1 et 2 de src_1, puis lines 3 à 20 de src_2, puis lignes 3 à la fin de src_1.

    Si c'est bien cela, voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed -n -e '1,2p' src_1 > dst
    sed -n -e '3,20p' src_2 >> dst
    sed -n -e '3,$p' src_1 >> dst
    Un problème bien posé est déjà résolu (H. Bergson).

  3. #3
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Je ne suis pas certain d'avoir bien compris le problème mais si c est uniquement recopier les lignes 3 à 20 je dirais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    head -23 monfichiersource | tail -20   > monfichierdest
    head me donne les 23 premières lignes et tail se limite au 20 dernières de la sélection précédente (donc normalement les lignes 3 à 20).
    - Informaticien passionné
    - ( java, c++, cobol, php, asp, ... )
    - http://www.berthou.com/fr/

  4. #4
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour,
    Citation Envoyé par rberthou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    head -23 monfichiersource | tail -20   > monfichierdest
    head me donne les 23 premières lignes et tail se limite au 20 dernières de la sélection précédente (donc normalement les lignes 3 à 20).
    Hum, ce ne serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    head -20 monfichiersource | tail -18   > monfichierdest
    ?
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  5. #5
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    head -20 monfichiersource | tail -18   > monfichierdest
    ?
    Oui apres avoir vérifié le message original (ce sont les lignes 3 à 20 et non pas 20 lignes à partir de la 3eme)
    - Informaticien passionné
    - ( java, c++, cobol, php, asp, ... )
    - http://www.berthou.com/fr/

  6. #6
    Membre éclairé 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 : 60
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Je ne suis pas sûr que la dernière partie soit correcte: Le fait de faire > monfichierdest crée simplement un nouveau fichier (ou supprime son contenu initial). Or il est demandé "... dans les lignes 3 à 20 d'un autre fichier", donc j'imagine que cet autre fichier existe déjà et a plus de trois lignes, il faut donc insérer les lignes extraites dans un autre fichier.
    Un problème bien posé est déjà résolu (H. Bergson).

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour et merci pour votre aide

    En fait je me suis mal exprimée.
    J'ai deux fichiers qui existent déjà : Fich1 et Fich2.
    Je souhaiterai recopier l'entête du fichier Fich1 (seulement les lignes 3 à 20) dans l'entête du fichier Fich2 (dans les lignes 3 à 20 du fichier Fich2).

    Il ne faut pas écraser les lignes 1 et 2 du fichier Fich2 ni les lignes 21 et les suivantes.

    Je ne sais pas si j'ai été claire

    Merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    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
    $ cat fich1 - fich2
    f1 line1
    f1 line2
    f1 line3
    f1 line4
    f1 line5
    f1 line6
                  # Ctrl-D
     
    f2 line_1
    f2 line_2
    f2 line_3
    f2 line_4
    f2 line_5
    f2 line_6
    $ sed -n '2,5 w /tmp/fich1' fich1
    $ sed -s '2,5 h; 1 r /tmp/fich1' fich2
    f2 line_1
    f1 line2
    f1 line3
    f1 line4
    f1 line5
    f2 line_2
    f2 line_3
    f2 line_4
    f2 line_5
    f2 line_6
    J'aimerais qu'il soit possible de n'utiliser qu'une seule commande sed, mais rien n'est moins certain , vu qu'il faut traiter deux fichiers
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre éclairé 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 : 60
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Aicha,

    Maintenant c'est moins clair: faut-il insérer les lignes sélectionnées de src_2 entre les lignes 2 et 3 de src_1 ou faut-il écraser les lignes 3 à 20 de src_1? S'il faut insérer, alors la solution que j'ai indiquée fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sed -n -e '1,2p' src_1 > src_1.new
    sed -n -e '3,20p' src_2 >> src_1.new
    sed -n -e '3,$p' src_1 >> src_1.new
    mv src_1.new src_1
    S'il faut écraser, alors une petite modif s'impose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sed -n -e '1,2p' src_1 > src_1.new
    sed -n -e '3,20p' src_2 >> src_1.new
    sed -n -e '21,$p' src_1 >> src_1.new
    mv src_1.new src_1
    Un problème bien posé est déjà résolu (H. Bergson).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Citation Envoyé par Aicha78
    sed -i "3,20 c\toto" file
    !
    Citation Envoyé par jmelyn
    un problème....
    Je suis à 100% d'accord avec H. Bergson

    Il nous manque des échantillons, et un/le résultat escompté
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonsoir et merci pour vos réponses !

    J'avoue que ce n'était pas claire pour moi non plus
    Et puis je ne connais pas bien la commande sed.

    En fait, j'ai trois scripts dont un avec des variables globales définies sur les lignes 3 à 20.
    Ces variables globales sont les même pour les trois scripts.
    Au lieu de faire des copier/coller à "la main", je voulais automatiser cela.

    Au début, je pensais laisser des espaces vides et écraser ses espaces vides par mes variables globales. Mais en fait, je trouve que c'est mieux d'insérer mes variables globales sans laisser des espaces vides avant.

    J'ai donc suivi la solution de jmelyn pour insérer et ça marche très bien.
    Par contre, juste un petit détail, j'ai fais des recherches cet après-midi :
    Je voudrais pouvoir modifier facilement les numéros de lignes : 3 et 20

    Par exemple, définir : deb_entete=3 et fin_entete=20
    Mais quand j'utilise $deb_entete et $fin_entete dans sed j'ai une erreur.

    Je crois que le $ dans sed correspond à une fin de ligne (quand on veut remplacer une occurrence par une autre par exemple).
    J'essaye d'annuler le $ par \ mais ça ne marche pas. Je ne comprend pas trop ...

    Aujourd'hui je voulais remplacer une occurrence (chemin=) par (chemin=/usr/local) et j'ai mis la chaine /usr/local dans la variable path_local.
    J'ai donc fais au début :
    sed -i 's/chemin=$/chemin=\$path_local/g' fichier
    Le premier $ (metacaractere) permet de dire que c'est une fin de ligne.

    Après j'ai essayé la commande suivante :
    sed -i "s#chemin=\$#chemin=$path_local#g" fichier, ça marche mais je ne comprend pas pourquoi ...
    Si quelqu'un peut m'expliquer

    En tout cas merci beaucoup pour votre aide

  12. #12
    Membre éclairé 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 : 60
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Ben c'est normal! Heu... c'est pas suffisant comme explication, alors je développe un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 'texte entre simples-quotes' fichier_in > fichier_out
    Tout ce qui est entre ' et ' est du texte simple passé à la commande sed. Donc pas de variables ($var), pas de commandes ($(ls -l)), pas de caractères spéciaux ($'\n'). Rien que du texte. Pour ajouter des variables, deux solutions:

    1. Mettre des doubles-quotes " au lieu des simples '. Dans ce cas, le shell reconnait certains caractères comme le $. Mais s'il y a d'autres $ (fin de ligne par exemple), il faut dire à l'interpréteur que ce ne sont pas des méta-caractères (signification spéciale), mais de simples caractères normaux, en les échappant: \$. S'il y en a beaucoup, c'est pas cool.
    2. Sortir les variables des simples-quotes pour que l'interpréteur n'interprète que ce qu'on veut. Un exemple valant mille mots...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1: sed -e "début...$var_1suite...$var_2fin..." fichier_in > fichier_out
    2: sed -e 'début...'$var_1'suite...'$var_2'fin...' fichier_in > fichier_out
    En rouge, ce qui n'est pas interprété par le shell. En noir ce que le shell va pouvoir interpréter. $var_1 et $var_2 vont être remplacés par leurs valeurs respectives.
    Un problème bien posé est déjà résolu (H. Bergson).

Discussions similaires

  1. [WD-2010] Recopier certains paragraphes d'un fichier vers un autre fichier
    Par delphys dans le forum Word
    Réponses: 1
    Dernier message: 06/04/2013, 21h59
  2. Réponses: 1
    Dernier message: 29/12/2008, 10h12
  3. Réponses: 7
    Dernier message: 17/10/2007, 08h32
  4. Copier le contenu d'un fichier vers un autre fichier Excel
    Par mathias dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/06/2007, 14h47
  5. Copier certaines lignes d'une table vers une autre
    Par TNorth dans le forum Requêtes
    Réponses: 8
    Dernier message: 25/07/2006, 14h31

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