Forum Programmation.shell Suppression de la fin d'un fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
11
mar.
2020

Bonjour à tous,

Voici mon problème, en voulant écrire un script bash.
Je précise que je débute…
Mon but est d'insérer un exercice, disons exo.tex (qui n'a pas de préambule), à la fin d'un fichier total.tex

Si le fichier existe déjà (parce que j'y aurais déjà inséré quelques exos), je voudrais insérer mon texte juste avant la fin du fichier repérée par:

%%% fin du fichier %%%
Conclusion
\end{document}

sinon, je voudrais créer le fichier total.tex, y mettre le préambule

\documentclass{article}
différents packages
\begin{document}

insérer mon exo.tex

puis écrire la fin du fichier.

%%% fin du fichier %%%
Conclusion
\end{document}

J'ai déjà cherché des solutions un peu partout, mais j'ai beaucoup de mal à manipuler les %(pour supprimer la fin d'une chaîne), sed (je n'y comprends rien…).
Merci de votre aide et de votre compréhension

  • # Quelques idées

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

    Pour afficher sur la sortie standard le fichier total.tex sans les trois dernières lignes :

    $ head -n -3 total.tex
    

    Pour ajouter exo.tex à la fin d'un fichier total2.tex :

    $ cat exo.tex >> total2.tex
    

    Plus qu'à faire la même chose avec un fichier contenant le suffixe :

    %%% fin du fichier %%%
    Conclusion
    \end{document}
    

    En liant un peu tout ça tu devrais y arriver.

    • [^] # Re: Quelques idées

      Posté par  . Évalué à 3.

      Il peut effectivement faire cela (qui fonctionnera dans le cas général, avec un autre type de fichier), ou utiliser plus simplement la commande tex "input" :

      \documentclass{article}
      \begin{document}
      
      \input{exo.tex}
      
      %%% fin du fichier %%%
      Conclusion
      \end{document}
      

      Il existe également des préprocesseur pour LaTeX, qui seront peut-être plus pratiques à manipuler.

      « Le pouvoir des Tripodes dépendait de la résignation des hommes à l'esclavage. » -- John Christopher

      • [^] # Re: Quelques idées

        Posté par  . Évalué à 1.

        Merci pour ta réponse,
        je connais \input effectivement, mais c'est seulement que c'est quelque chose que je voudrais automatiser.

        Je dois faire régulièrement des automatismes en première STMG (pour les connaisseurs).
        Du coup, je crée des exos rangés dans différents dossiers (evolution, derivation…), et je veux écrire ce script pour sélectionner simplement ces exos un par un, et les concaténer dans mon fichier automatisme_date.

        Je trouve ça plus rapide que réécrire mon document avec son préambule, aller chercher mes exos qui sont dans différents dossiers, etc.
        Et puis comme ça, ça me fait apprendre la programmation en bash, il n'est jamais trop tard :)

    • [^] # Re: Quelques idées

      Posté par  . Évalué à 1.

      Voilà mon code pour le moment:
      Si le fichier existe déjà, ça ne bug pas, mais il ne supprime pas les 5 dernières lignes
      Si le fichier n'existe pas encore, ça bug, avec le message:
      $'\documentclass{beamer}
      \usepackage{différents packages}
      Il y a des % et des # dans ce texte, je ne sais pas
      si c'est important ' : commande introuvable

      #!//bin/bash
      d=$(date +%Y_%m_%d)                                                                                                                
      file='automatismes_'$d.tex                                                                                                            
      if [ -f "$file" ] ; 
      then                                                                                                              
      #Supprimer les 5 dernières lignes du fichier si le fichier existe déjà
      head -n -5 $file >> $file
      #Ajouter mon exercice                                                                                                                               
      cat $1 >> $file                                                                                                                         
      #Si le fichier n'existe pas encore
      else
          touch $file
      #Ajouter le début du fichier
      "\documentclass{beamer}
      \usepackage{différents packages}
      Il y a des % et des # dans ce texte, je ne sais pas 
      si c'est important :" >> $file
      fi
      
      # Copier la fin du fichier
      echo "ligne 1
      ligne 2
      ligne 3
      ligne 4
      \end{document}">>$file
      • [^] # Re: Quelques idées

        Posté par  . Évalué à 1.

        Bon, j'ai déjà compris une de mes bêtises.

        Il ne fallait pas mettre

        head -n -5 $file >> $file

        mais

        head -n -5 $file > $file

        Il me reste le problème de la commande introuvable…

        • [^] # Re: Quelques idées

          Posté par  . Évalué à 2.

          head -n -5 $file >> $file

          J'ai souvenir de comportements tranges lorsque je faisais ça ….

          En shell il vaut mieux éviter d'écraser un fichier en cours de traitement …

      • [^] # Re: Quelques idées

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

        Pourquoi un double slash devant bin ?

        #!//bin/bash
        
      • [^] # Re: Quelques idées

        Posté par  (site web personnel) . Évalué à 1. Dernière modification le 12 mars 2020 à 10:55.

        Pour éviter à la fois les problèmes liés aux éventuels espaces dans les noms de fichier et les subtilités du shell, il est conseillé d'écrire "${file}" plutôt que $file. Même si ici ça marche, il vaut mieux prendre de bonnes habitudes.

    • [^] # Re: Quelques idées

      Posté par  . Évalué à 2.

      Pour ajouter exo.tex à la fin d'un fichier total2.tex :

      $ cat exo.tex >> total2.tex

      Bof …

      moi je ferais un truc du genre cat exo1.txt exo2.txt > total;txt.

  • # echoes

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

    il manque le echo devant "\documentclass{beamer}

    • [^] # Re: echoes

      Posté par  . Évalué à 1.

      C'est ça, merci beaucoup !
      J'avoue que je ne comprends pas pourquoi, je croyais que echo était là pour visualiser le contenu d'une variable, du coup, je pensais qu'en mettant une chaîne de caractère, il n'y en avait pas besoin

      • [^] # Re: echoes

        Posté par  . Évalué à 1.

        Ah bah non, ça ne marche pas encore…
        Si le fichier n'existe pas, c'est parfait.
        Si le fichier existe, il n'y a pas le préambule

        • [^] # Re: echoes

          Posté par  . Évalué à 1.

          Bon, désolé pour le harcèlement, je crois que j'ai trouvé:

          Je ne devais pas mettre
          head -n -5 $file >> $file
          mais
          head -n -5 $file >> file

          Merci à tous pour cette aide précieuse

          • [^] # Re: echoes

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

            Oui, $file désigne le contenu de la variable file.
            Et le file de droite est un fichier qui s'appelle file.

      • [^] # Re: echoes

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

        Non, echo sert à afficher une ligne de texte, éventuellement contenue dans une variable.

        • [^] # Re: echoes

          Posté par  . Évalué à 2.

          Tout à fait et man est une commande qui permet de savoir ce que fait une commande (exemple de la page man d'echo ). tu peux faire man man pour savoir comment utiliser la commande man (une commande récursive … ;) ).

  • # Suppression de la fin d'un fichier

    Posté par  . Évalué à 1. Dernière modification le 17 mars 2020 à 09:34.

    Bonjour,
    La suppression de fichier est une action qui consiste à effacer un fichier d’un système de fichiers. La plupart du temps, les fichiers sont supprimés car ils contiennent des données redondantes, inutiles, sensibles ou compromettantes. Les autres causes pouvant également mené à la suppression de fichiers sont la nécessité de libérer de l’espace ou encore une fausse manœuvre.

Suivre le flux des commentaires

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