395 votes

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

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

2 votes

Il n'y a pas de moyen efficace de le faire pour les gros fichiers : unix.stackexchange.com/questions/87772/

0 votes

Pourriez-vous jeter un coup d'œil à cette méthode superuser.com/a/1352628/11116

4voto

Rucent88 Points 682

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 écraser tout le fichier.

0 votes

Juste pour poser la question évidente : Où est la limite de caractères des variables Shell ?

0 votes

Pour autant que je sache, il n'est limité que par la quantité de mémoire disponible. J'ai rempli des variables de plus de 100 Mo en mémoire. text=$(cat file) . Attention toutefois à n'utiliser que du texte, car les variables Shell ne sont pas binaires propres. mywiki.wooledge.org/BashFAQ/058

3voto

jlliagre Points 13539

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 actuelle du fichier.

Toute solution à votre question nécessite alors la création d'un fichier temporaire (ou tampon) (en 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 original tout en créant le nouveau, si le système de fichiers s'avère être plein pendant le processus. ex :

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt

0 votes

Les bailleurs de fonds sont invités à expliquer leur motivation. Aucune des réponses restantes, y compris celle qui a été acceptée, ne contredit quoi que ce soit dans ma réponse.

0 votes

C'est difficile à analyser car les < .... > ressemblent à des parenthèses, ce qui, je suppose, n'est pas le cas. Un espace entre le < et le ( pourrait aider ?

0 votes

Cela ne fonctionne pas pour moi. 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 : No such file or directory"

2voto

Mr. Mr. Points 987

Vous pouvez utiliser tee :

echo 'task goes here' | cat - todo.txt | tee todo.txt

4 votes

Non, vous ne pouvez pas. askubuntu.com/a/752451

2voto

Melvin Roest Points 171

Réponse finale

cat <<< "prepended text
$(cat test.txt)" > test.txt

Contexte

Je n'étais pas très satisfaite des réponses, car j'avais l'impression qu'il fallait trop taper. J'ai aimé la réponse de John Alberts, mais je ne pouvais pas supporter de taper. -e . Malheureusement, j'ai accidentellement lu sur John Alberts son echo 2 liner également (ce qui réduit considérablement la valeur de cette réponse et de mes 30 minutes de jeu, mais bon, ça arrive).

Quoi qu'il en soit, je m'efforçais de trouver quelque chose qui vous permette de n'avoir qu'à taper le nom du fichier et le texte à ajouter au début.

De plus, je cherchais quelque chose qui soit esthétiquement intuitif. Je veux dire par là que le préambule doit être physiquement visible, même si ce n'est qu'une illusion, il doit avoir l'effet d'un moyen mnémotechnique.

J'ai donc tenté une approche avec les phrases d'encouragement, car dans le bon contexte, elles réduisent la charge cognitive (c'est-à-dire la saisie). < 3 fois ne demande pas trop de puissance de réflexion).

J'ai créé un fichier test.txt avec le mot "monkeys" .

Et j'ai tapé :

cat <<< "prepend
> $(< test.txt)"

出力します。

prepend
monkeys

Une petite clarification :

Vous devez appuyer manuellement sur enter vous-même.

Sur la deuxième ligne, le > provient du Shell lui-même, vous n'avez pas besoin de le taper.

Notes :

(1) Ce que je n'ai pas réussi à faire, c'est un "one liner". Il semble qu'il n'y ait pas de combinaison de phrases dans lesquelles je pourrais utiliser $() y \n . C'est pourquoi vous devez appuyer vous-même sur le saut de ligne manuellement.

(2) $(< test.txt) a le même effet que $(cat test.txt) . Le site Manuel de référence Bash États :

La substitution de commande $(cat file) peut être remplacé par l'équivalent mais plus rapide $(< file) .

Donc vous pouvez aussi le faire :

cat <<< "prepend
> $(cat test.txt)"

Plus de frappe, mais j'admets qu'il y a un peu moins d'effort cognitif puisque cat est tapé deux fois et est plus connu que l'astuce du manuel de référence de Bash.

0voto

GitBash + Windows10 + Multline :

Voici une version qui vous permet d'utiliser chaînes 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]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X