[Script shell]Ecrire dans un fichier

Résolu
Bonjour,

Voilà je cherche à écrire le contenu d'un fichier dans un autre fichier, mais à un endroit bien précis.

Exemple :

Fichier A:
blablabla
blabla
blablablabla
####
blablabla


Fichier B:
coucou
salut


Je veux en résultat que mon fichier A contienne :
blablabla
blabla
blablablabla
####
coucou
salut
blablabla


Tout simplement intégrer des lignes de code à l'intérieur d'un fichier de code :)

3 réponses

  1. Contributeur
    Salut.
    Je ne sais pas comment faire exactement, mais je peut te donner une méthode :
    avec grep tu repères la ligne (cherche la bonne option) puis avec head et tail tu concatène le tout.
    a=$(grep "####" [bonne option] fichier_A)
    head -n $a fichier_A>resu
    cat fichier_B>>resu
    (( a++ ))
    tail -n +$a fichier_A>>resu
    0
    1. Contributeur
      Salut,

      $ cat A
      blablabla
      blabla
      blablablabla
      ####
      blablabla
      
      $ cat B
      coucou
      salut
      
      $ sed -i.bak '/####/r B' A
      
      $ cat A
      blablabla
      blabla
      blablablabla
      ####
      coucou
      salut
      blablabla
      
      $

      ;-))
      0
      1. Contributeur
        manque plus qu'une solution awk, et nous aurons la totale :-D
        0
    2. OK, merci pour ça, c'est un début, mais avec les explications, ça serait super.
      Car ce que je dois faire va plus loin.

      De plus, voilà mon test :

      sed -i.bak '22:cd_vm/r 23:cd_coucou' /usr/share/config.txt


      Le résultat :

      sed: -e expression n=°1, caractère 3: : n'a besoin d'aucune adresse


      En bref il n'aime pas les caractères spéciaux.
      0
      1. Contributeur
        Bon, le mieux serait peut être que tu nous montres à quoi ressemble tes fichiers et ce que tu veux y changer, non ?
        0
      2. Oui ça pas de problème, à récupérer un code qui marche, j'aime aussi comprendre les commandes.
        le fichier de base est en dessous.
        Le texte en gras est celui que je cherche à importer.

        <ORDER>
        0:cd_processors
        1:cd_memories
        2:cd_storages
        3:cd_drives
        4:cd_videos
        5:cd_sounds
        6:cd_networks
        7:cd_controllers
        8:cd_slots
        9:cd_ports
        10:cd_admininfo
        11:cd_comments
        12:cd_configuration
        13:cd_bios
        14:cd_softwares
        15:cd_packets
        16:cd_registry
        17:cd_monitors
        18:cd_inputs
        19:cd_printers
        20:cd_modems
        21:cd_mobile
        22:cd_vm
        23:cd_officepack
        </ORDER>
        
        <LBL>
        cd_admininfo:g(56)
        cd_comments:Notes
        cd_bios:g(273)
        cd_configuration:g(500)
        cd_controllers:g(93)
        cd_drives:g(92)
        cd_inputs:g(91)
        cd_memories:g(26)
        cd_mobile:g(994)
        cd_modems:g(270)
        cd_monitors:g(97)
        cd_networks:g(82)
        cd_packets:g(512)
        cd_ports:g(272)
        cd_printers:g(79)
        cd_processors:g(54)
        cd_registry:g(211)
        cd_slots:g(271)
        cd_softwares:g(20)
        cd_sounds:g(96)
        cd_storages:g(63)
        cd_videos:g(61)
        cd_vm:g(1266)
        cd_officepack:cd_officepack
        </LBL>
        
        <ISAVAIL>
        cd_admininfo:accountinfo
        cd_bios:bios
        cd_controllers:controllers
        cd_drives:drives
        cd_inputs:inputs
        cd_memories:memories
        cd_mobile:javainfo
        cd_modems:modems
        cd_monitors:monitors
        cd_networks:networks
        cd_packets:download_history
        cd_ports:ports
        cd_printers:printers
        cd_registry:registry
        cd_slots:slots
        cd_softwares:softwares
        cd_sounds:sounds
        cd_storages:storages
        cd_videos:videos
        cd_vm:virtualmachines
        cd_officepack:cd_officepack
        </ISAVAIL>
        
        <URL>
        cd_processors
        cd_memories:1
        cd_storages:2
        cd_videos:4
        cd_sounds:5
        cd_networks:6
        cd_controllers:7
        cd_slots:8
        cd_admininfo:10
        cd_comments:11
        cd_configuration:12
        cd_bios:13
        cd_softwares:14
        cd_packets:15
        cd_registry:16
        cd_monitors:17
        cd_inputs:18
        cd_printers:19
        cd_mobile:21
        cd_vm:22
        cd_officepack:23
        </URL>
        
        0
      3. Contributeur
        Euh... je n'ai pas tout pigé là ;-(

        Ça c'est le fichier de base ?
        Il faut importer un truc après les lignes en gras ?

        Sinon pour l'explication de la commande avec sed :

        sed -i.bak
        L'option "-i" (in-place) permet d'éditer le fichier original en live. Le ".bak" permet de faire une copie de l'original

        /####/
        Le motif de recherche est placé entre des slashs.

        r B
        La commande "r fichier" permet de lire le contenu d'un fichier et de l'ajouter à la suite du motif fourni.
        0
      4. OK super merci pour ces explications.
        Peut on faire la même chose, mais sans utiliser un deuxième fichier ?

        Dans mon post précédent, on retrouve le fichier final avec en gras les lignes qui n'y sont pas au départ (qui doivent être ajoutées via le script).

        sed -i.bak '22:cd_vm/r 23:cd_coucou' /usr/share/config.txt


        Avec cette commande, je pensais mettre en dessous de la ligne qui contient 22:cd_vm la ligne 23:cd_coucou

        La commande ne marche pas, visiblement sed bloque sur les :
        0
      5. Contributeur
        Il n'est pas impossible que ":" soit un caractère spécial. Il faut alors l'échappé. essai en écrivant :
        22\:cd_vm.
        D'après ce que dit zipe31, "r" dans sed serd à insérer un fichier. Dans ton cas, il va chercher un fichier 23:cd_coucou.
        regarde la documentation de sed.
        0

    Discussions similaires

    question pix mot caché

    7 réponses