web-dev-qa-db-fra.com

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

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

264
user479534
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
349
Dennis Williamson

Une option plus simple à mon avis est:

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 ne soit écrasé par > todo.txt

Tandis que les autres réponses fonctionnent bien, je trouve cela beaucoup plus facile à retenir parce que j'utilise écho et chat tous les jours.

EDIT: Cette solution est une très mauvaise idée s'il y a des barres obliques inverses dans todo.txt, car grâce au drapeau -e, echo les interprétera. Un autre moyen, beaucoup plus simple, de placer des 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 one-liner, mais de manière réaliste, ce n'était pas un one-liner auparavant. Si vous faites cela dans un script et que vous craignez d'indenter (par exemple, vous l'exécutez dans une fonction), plusieurs solutions de contournement sont à votre disposition pour que cela reste bien ajusté, notamment:

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

De plus, si vous vous souciez de savoir si une nouvelle ligne est ajoutée à la fin de todo.txt, ne l'utilisez pas. Eh bien, sauf l'avant-dernier. Cela ne plaisante pas avec la fin.

67
John Alberts

Les moreutils ont un outil de Nice appelé sponge:

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

Cela va "absorber" STDIN et ensuite écrire dans le fichier, ce qui signifie que vous n'avez pas à vous soucier des fichiers temporaires et de les déplacer.

Vous pouvez obtenir moreutils avec de nombreuses distributions Linux, via apt-get install moreutils, ou sous OS X avec Homebrew , avec brew install moreutils.

28
slhck

Vous pouvez utiliser Vim en mode Ex:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 sélectionner la première ligne

  2. i insert

  3. x enregistrer et fermer

7
Steven Penny

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 fondamentalement, la même chose se produit.

5
Keith

Si le fichier texte est suffisamment petit pour tenir en mémoire, vous n'avez pas besoin de créer un fichier temporaire pour le remplacer. Vous pouvez tout charger en mémoire et l'écrire 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 écraser le fichier entier.

3
Rucent88

Vous ne pouvez pas insérer de contenu au début d'un fichier. La seule chose à 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 tampon) (sur la mémoire ou sur le disque), qui écrasera le fichier d'origine.

Veillez à ne pas perdre de données en préservant le fichier d'origine lors de la création du nouveau, si le système de fichiers était saturé au cours du processus. par exemple:

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

Vous pouvez utiliser tee:

echo 'task goes here' | cat - todo.txt | tee todo.txt
1
Radu Rădeanu

Git Bash + Windows 10 + Multiligne :

Voici une version qui vous permet d’utiliser des chaînes multi-lignes .

##############################################
## This section for demo purpose only,      ##
## So you can save entire file as           ##
## whatever.sh and run it.                  ##
##                                          ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################

## Below is main code:

##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//|  +-------------------------------------+   |//
//|  |                                     |   |//
//|  |     MESSAGE_FOR_HEAD_OF_FILE        |   |//
//|  |                                     |   |//
//|  +-------------------------------------+   |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE                       ##
TEX=$ADD_TO_HEAD_VARIABLE                       ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################

## Expected contents of MY_TARGET_FILE.txt :
## //|  +-------------------------------------+   |//
## //|  |                                     |   |//
## //|  |     MESSAGE_FOR_HEAD_OF_FILE        |   |//
## //|  |                                     |   |//
## //|  +-------------------------------------+   |//
## [STARTER_CONTENT]
0
J MADISON