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).
285
Réponses:
ou
ou
la source
|
) le message (echo '...'
)cat
auquel utilise-
(entrée standard) le premier fichier ettodo.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
) letemp
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 decat
, essayez de sifflerhexdump -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 essayercat -e
d’afficher les fins de ligne.1
moyens ne font la prochaine commande que sur la première ligne du fichier et lai
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:
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 ...... 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:
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.la source
-e
convertira- t-il pas également les séquences d'échappement dans todo.txt?Ils
moreutils
ont un bel outil appelésponge
: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, viaapt-get install moreutils
ou sous OS X, avec Homebrew , avecbrew install moreutils
.la source
(echo 'ble'; cat todo.txt)
Vous pouvez utiliser Vim en mode Ex:
1
sélectionner la première lignei
insérerx
sauver et fermerla source
Vous pouvez créer un nouveau fichier temporaire.
Vous pouvez également utiliser
sed
ouawk
. Mais fondamentalement, la même chose se produit.la source
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.
Il est impossible d'ajouter des lignes au début du fichier sans écraser le fichier entier.
la source
text=$(cat file)
. Veillez toutefois à n'utiliser que du texte, car les variables du shell ne sont pas des fichiersVous 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:
la source
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
fonctionne maiscat <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
:la source
GitBash + Windows10 + Multline :
Voici une version qui vous permet d’utiliser des chaînes multilignes .
la source