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 au courant echo 'task goes here' >> todo.txt
mais cela ajoute la ligne à la fin du fichier (pas ce que je veux).
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 au courant echo 'task goes here' >> todo.txt
mais cela ajoute la ligne à la fin du fichier (pas ce que je veux).
Réponses:
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
|
) le message ( echo '...'
) cat
auquel utilise -
(entrée standard) le premier fichier et todo.txt
le second. cat
conCATenates plusieurs fichiers. Envoyez la sortie ( >
) dans un fichier nommé temp
. S'il n'y a pas d'erreur ( &&
), cat
renommez ( mv
) le temp
fichier dans le fichier d'origine ( todo.txt
).
cat
reçoit une barre oblique inverse littérale n, il ne le convertira pas en une nouvelle ligne. Quelque chose d'autre a dû faire ça. Au lieu de cat
, essayez de siffler hexdump -C
pour voir si vous envoyez réellement une barre oblique inverse et n ou s'il s'agit d'une nouvelle ligne. Vous pouvez également essayer cat -e
d’afficher les fins de ligne.
1
moyens ne font la prochaine commande que sur la première ligne du fichier et la i
commande est insert. Recherchez dans la page de manuel sous la section "Adresses" et dans la section "Commandes à zéro ou une adresse".
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 d' todo.txt
être écrasée par> todo.txt
Alors 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 ya des barres obliques inverses todo.txt
, car grâce à l’ -e
écho du drapeau, elles seront interprétées. 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 non plus 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), il existe quelques solutions de contournement pour que cela reste bien ajusté, 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
De même, si vous vous souciez de savoir si une nouvelle ligne est ajoutée à la fin de todo.txt
, n'utilisez pas ces options. Eh bien, sauf l'avant-dernier. Cela ne plaisante pas avec la fin.
-e
convertira- t-il pas également les séquences d'échappement dans todo.txt?
Ils moreutils
ont un bel outil 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 utiliser moreutils
de nombreuses distributions Linux, via apt-get install moreutils
ou sous OS X, avec Homebrew , avec brew install moreutils
.
(echo 'ble'; cat todo.txt)
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
insérer
x
sauver 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.
new_todo.txt
n’est écrit que partiellement. Votre solution semble perdre le fichier d'origine.
rm
du fichier d'origine.
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 original.
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
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
fonctionne mais cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
donne l’erreur "echo: Aucun fichier ou répertoire de ce type"
<
et le (
briserait la syntaxe. Essayezcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Vous pouvez utiliser tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
Voici une version qui vous permet d’utiliser des chaînes multilignes .
##############################################
## 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]