[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

Résumé de la discussion

Question demande comment écrire le contenu d'un fichier dans un autre à une position précise, afin d'intégrer des lignes d'un fichier B au milieu du fichier A tout en conservant le reste. Des propositions utilisent grep pour localiser la ligne délimitant, puis head et tail pour extraire et concaténer; d'autres évoquent sed avec -i ou ed pour insérer des lignes, selon le système. Pour répondre efficacement, il faut préciser l'environnement (Windows, Linux/Unix) et les outils disponibles, car les méthodes diffèrent entre des commandes comme grep, sed ou ed et les redirections. En pratique, le choix de l'indicateur de position et le traitement des délimitations (####, balises) déterminent l'approche; des tests sur des copies évitent les pertes de données.

Bobot (l’IA à votre service)
  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.
    1. Contributeur
      Bon, le mieux serait peut être que tu nous montres à quoi ressemble tes fichiers et ce que tu veux y changer, non ?
    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>
      
    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.
    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 :
    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.
  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
    
    $

    ;-))
    1. Contributeur
      manque plus qu'une solution awk, et nous aurons la totale :-D
  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

    Discussions similaires

    question pix mot caché

    7 réponses