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
sélection de la première ligne
J'insère
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