2011-02-17 03:21:12 +0000 2011-02-17 03:21:12 +0000
306
306
Advertisement

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

Advertisement

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

Advertisement

Réponses (9)

396
396
396
2011-02-17 03:34:10 +0000
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
81
81
81
2012-12-19 18:57:40 +0000

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

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

EDIT: Cette solution est une très mauvaise idée s'il y a des backslashes dans todo.txt, car grâce au drapeau de -e, echo les interprétera. Un autre moyen, bien plus simple, d'introduire des interlignes dans la chaîne de préface est…

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

…d'utiliser simplement des interlignes. Bien sûr, ce n'est plus une ligne unique, mais de façon réaliste, ce n'était pas non plus une ligne unique auparavant. Si vous faites cela à l'intérieur d'un script et que vous vous inquiétez de l'indentation (par exemple, vous l'exécutez à l'intérieur d'une fonction), il existe quelques solutions de contournement pour que cela fonctionne encore parfaitement, notamment :

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

De même, si vous vous souciez de savoir si une nouvelle ligne sera ajoutée à la fin de todo.txt, n'utilisez pas ces solutions. Sauf l'avant-dernier. Cela ne nuit pas à la fin.

28
Advertisement
28
28
2013-04-22 12:47:19 +0000

Les moreutils ont un bel outil appelé sponge :

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

Il va “absorber” STDIN et ensuite écrire dans le fichier, ce qui signifie que vous n'avez pas à vous soucier des fichiers temporaires et de leur déplacement.

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

12
12
12
2016-04-11 00:23:56 +0000

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 insérer

  3. x sauvegarder et fermer

5
Advertisement
5
5
2011-02-17 03:26:24 +0000

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

3
3
3
2011-02-17 06:25:01 +0000

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

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

Attention à ne pas perdre de données en préservant le fichier original lors de la création du nouveau, si le système de fichiers se trouve être plein pendant le processus. ex :

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
3
Advertisement
3
3
2013-01-09 22:49:33 +0000

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

1
1
1
2014-07-08 14:16:36 +0000

Vous pouvez utiliser tee :

echo 'task goes here' | cat - todo.txt | tee todo.txt
0
Advertisement
0
0
2018-08-04 07:04:48 +0000

GitBash + Windows10 + Multline :

Voici une version qui vous permet d'utiliser des chaîne de caractères 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]
Advertisement