[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. 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
    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
      
      $

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

    Discussions similaires

    question pix mot caché

    7 réponses