Comment puis-je ajouter du texte au début d'un fichier dans Bash?

Salut, je veux préciser le texte dans un fichier. Par exemple, je veux ajouter des tâches au début d'un fichier todo.txt. Je suis conscient que echo 'task goes here' >> todo.txt mais qui ajoute la ligne à la fin du fichier (pas ce que je veux).

 echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt 

ou

 sed -i '1s/^/task goes here\n/' todo.txt 

ou

 sed -i '1itask goes here' todo.txt 

Une option plus simple à mon avis est la suivante:

 echo -e "task goes here\n$(cat todo.txt)" > todo.txt 

Cela fonctionne car la commande à l'intérieur de $(...) est exécutée avant que todo.txt soit écrasé avec > todo.txt

Bien que les autres réponses fonctionnent bien, je trouve cela beaucoup plus facile à retenir car j'utilise echo and cat tous les jours.

EDIT: Cette solution est une très mauvaise idée si il existe des barres obliques inverses dans todo.txt , car grâce à l'écho- -e , les echo les interpréteront. Une autre façon, beaucoup plus facile d'obtenir de nouvelles lignes dans la chaîne de préface, est …

 echo "task goes here $(cat todo.txt)" > todo.txt 

… simplement pour utiliser les nouvelles lignes. Bien sûr, ce n'est plus un seul type, mais, de façon réaliste, ce n'était pas non plus un one-liner avant. Si vous faites cela dans un script et vous inquiétez de votre retrait (par exemple, vous exécutez cela dans une fonction), il existe quelques solutions de rechange pour que cela soit toujours bien adapté, y compris, mais sans s'y limiter:

 (echo 'task goes here' && cat todo.txt) > todo.txt echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt 

En outre, si vous vous demandez si une nouvelle ligne est ajoutée à la fin de todo.txt , ne les utilisez pas. Eh bien, sauf le deuxième au dernier. Cela ne gêne pas avec la fin.

Les plus moreutils ont un bon outil appelé sponge :

 echo "task goes here" | cat - todo.txt | sponge todo.txt 

Il "absorber" STDIN, puis écrire sur le fichier, ce qui signifie que vous ne devez pas vous soucier des fichiers temporaires et de les déplacer.

Vous pouvez obtenir plus d' moreutils avec plusieurs distros Linux, via apt-get install moreutils ou sur OS X à l'aide de Homebrew , avec brew install moreutils .

Vous pouvez créer un nouveau fichier temporaire.

 echo "new task" > new_todo.txt cat todo.txt >> new_todo.txt rm todo.txt mv new_todo.txt todo.txt 

Vous pouvez également utiliser sed ou awk . Mais essentiellement, la même chose se produit.

Vous pouvez utiliser Vim en mode Ex:

 ex -sc '1i|task goes here' -cx todo.txt 
  1. 1 sélection de la première ligne

  2. J'insère

  3. x enregistrer et fermer

Si le fichier texte est suffisamment petit pour entrer dans la mémoire, il n'est pas nécessaire de créer un fichier temporaire pour le remplacer. Vous pouvez tout charger dans la mémoire et l'écrire à nouveau dans le fichier.

 echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt 

Il est impossible d'ajouter des lignes au début du fichier sans avoir écrit l'intégralité du fichier.

Vous ne pouvez pas insérer de contenu au début d'un fichier. La seule chose que vous pouvez faire est de remplacer le contenu existant ou d'ajouter des octets après la fin du fichier en cours.

Toute solution à votre question nécessite alors la création d'un fichier temporaire (ou de mémoire tampon) (sur la mémoire ou sur le disque) qui finira par écraser le fichier d'origine.

Veillez à ne pas perdre de données en conservant le fichier d'origine tout en construisant le nouveau, si le système de fichiers est plein pendant le processus. par exemple:

 cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt 

Vous pouvez utiliser tee :

 echo 'task goes here' | cat - todo.txt | tee todo.txt