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).
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:
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.
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
.
Vous pouvez utiliser Vim en mode Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
sélectionner la première ligne
i
insert
x
enregistrer et fermer
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.
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.
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
Vous pouvez utiliser tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
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]