[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. 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
  2. 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
  3. 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

    Discussions similaires

    question pix mot caché

    7 réponses