Forum Linux.débutant insertion de lignes dans un fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
7
fév.
2017

Bonjour à tous

J'aimerais écrire un script qui insère trois (3) lignes supplémentaires après chaque ligne dans un fichier.
Exemple: le fichier initial peut ressembler à ceci
ligne1………………..
ligne2………………..
ligne3………………..
ligne4………………..
ligne5………………..
etc.

à la fin j'aimerais avoir:
ligne1………………..
ligne_supplémentaire_1
ligne_supplémentaire_2
ligne_supplémentaire_3
ligne2………………..
ligne_supplémentaire_1
ligne_supplémentaire_2
ligne_supplémentaire_3
ligne3………………..
ligne_supplémentaire_1
ligne_supplémentaire_2
ligne_supplémentaire_3
ligne4………………..
ligne_supplémentaire_1
ligne_supplémentaire_2
ligne_supplémentaire_3
ligne5………………..
ligne_supplémentaire_1
ligne_supplémentaire_2
ligne_supplémentaire_3
etc.

Un autre détail, les trois lignes que j’insère sont statiques (les mêmes dans tout le fichier).
Merci d'avance pour votre aide

  • # Avec sed

    Posté par  . Évalué à 1. Dernière modification le 07 février 2017 à 10:26.

    Une manière de le faire avec for et sed

    for i in {1,2,3,4,5};do sed -i "/ligne$i.../aligne_supplémentaire_1\nligne_supplémentaire_2\nligne_supplémentaire_3" ligne;done

    • [^] # Re: Avec sed

      Posté par  . Évalué à 2.

      Et si tu veux faire l'ajout pour chaque ligne indistinctement de ce qu'elle contient (de ce que je comprends de la question), il suffit de laisser uniquement le "a…", c-à-d :

      sed -i "aligne_supplémentaire_1\nligne_supplémentaire_2\nligne_supplémentaire_3" fichier
      
  • # avec echo

    Posté par  . Évalué à 3. Dernière modification le 07 février 2017 à 10:31.

    while read line
    do
      echo $line
      echo "ligne_supp1"
      echo "ligne_supp2"
      echo "ligne_supp3"
    done < <( cat fichier_origine.txt ) >fichier_final.txt
    
    cp fichier_origine.txt fichier_origine.org
    mv fichier_final.txt fichier_origine.txt
    • [^] # Re: avec echo

      Posté par  (site web personnel) . Évalué à 5. Dernière modification le 07 février 2017 à 10:53.

      Trois remarques:

      1. Il vaut presque toujours mieux d'utiliser printf au lieu de echo:
      printf '%s\n' "${line}" "ligne_supp1" "ligne_supp2" "ligne_supp3"
      

      Cela évite des mauvaises surprises, si par exemple "${line}" commence par -- ou contient des séquences d'échappement qui, selon le shell utilisé, pourraient être interprétées.
      (À la différence de la fonction C, le programme printf applique périodiquement le format pour épuiser ses arguments.)

      1. Utilsation de cat inutile:
      done < <( cat fichier_origine.txt ) >fichier_final.txt
      

      Que c'est compliqué! On peut écrire

      done < fichier_origine.txt > fichier_final.txt
      
      • [^] # Re: avec echo

        Posté par  . Évalué à 2.

        va pour le print plutot que le "echo"
        mais selon le niveau de la personne, le echo reste plus simple à comprendre.

        quand à l'echappement de caractere, etc, oui evidemment il faut y penser et "${line}" est toujours mieux que $line

        enfin pour ma syntaxe qui se veut pedagogie plus qu'optimale

        aujourd'hui il veut lire un fichier cat le_fichier
        demain il veut faire un truc similaire à partir de la liste des fichiers contenu dans un dossier, ou une liste de dossier, ou la sortie d'une commande lambda

        bah il remplace juste le cat fichier_origine par commande lambda

        • [^] # Re: avec echo

          Posté par  (site web personnel) . Évalué à 3.

          mais selon le niveau de la personne, le echo reste plus simple à comprendre.

          C'est triste ce que tu penses du niveau des débutants. :)

          Blague à part, la multiplicité des point de vue ne peut pas nuire à l'apprentissage, et puis on ne sait pas d'où vient l'OP: il peut très bien être débutant en shell mais un programmeur chevronné avec d'autres outils, il n'y a donc pas de raison de cacher ces détails (un tout petit peu) plus délicats!

      • [^] # Re: avec echo

        Posté par  . Évalué à 2.

        si par exemple "${line}" commence par—ou contient des séquences d'échappement qui, selon le shell utilisé

        Quels shells ?

        Sous bash (qui utilise coreutil) le manuel ne spécifie pas de différence de comportement (la page info de echo indique que '--' n’est pas interprété spécialement, c’est tout). Il me semble que les deux commandes font appel aux mêmes fonctions de plus bas niveau avec un comportement plutôt homogène.

        $ echo "--plop"
        --plop
        $ printf "%s\n" "--plop" 
        --plop
        $ env echo "--plop"
        --plop
        $ env printf "%s\n" "--plop" 
        --plop
        

        ?

        Toujours est-il que ça reste une très bonne idée de passer à printf le plus tôt possible, même pour un débutant, car la nécessité d’utiliser le formatage va vite venir.

  • # Merci

    Posté par  . Évalué à 2.

    Merci beaucoup pour toutes les réponses apportées, je suis très satisfait.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.