142 votes

ajouter un fichier à une ligne de shell?

C'est probablement une solution complexe.

Je suis à la recherche d'un opérateur simple, comme ">>", mais de préparer.

Je crains qu'il n'existe pas. Je vais devoir faire quelque chose comme

 mv myfile tmp
 chat myheader tmp > myfile

Rien de plus intelligent? (Je ne suis pas friand des fichiers tmp)

110voto

Jason Navarrete Points 3873

Ce toujours utilise un fichier temporaire, mais au moins il est sur une seule ligne:

echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile

Crédit: BASH: Ajouter Un Texte ou des Lignes D'un Fichier

35voto

fluffle Points 141
echo '0a
your text here
.
w' | ed some_file

ed est le Standard de l'Éditeur! http://www.gnu.org/fun/jokes/ed.msg.html

31voto

John Mee Points 12004

Ce petit hack a été un rapide hors-la-brassard réponse. Cependant, cette question est devenue étrangement populaire au fil des ans, et la solution n'a pas résisté à l'épreuve du temps. A utiliser à vos risques et périls...

#!/bin/bash
text="Hello world
What's up?"

exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3

La création d'un autre descripteur de fichier pour le fichier (exec 3<> yourfile) de là, vers l'écriture (>&3) semble dépasser la lecture/écriture sur le même fichier dilemme. Fonctionne pour moi sur 600K fichiers avec awk. Cependant essayé le même truc à l'aide de 'chat' échoue.

En passant la prependage comme une variable awk (-v TEXT="$text") de surmonter les citations littérales nuisance qui entrave avec "sed".

20voto

anonymous Points 159

Jean-Mee: votre méthode n'est pas garanti, et va probablement échouer si vous la faire précéder de plus de 4 096 octets de choses (du moins, c'est ce qui se passe avec gnu awk, mais je suppose que d'autres implémentations ont les mêmes contraintes). Non seulement il va échouer dans ce cas, mais il va entrer dans une boucle sans fin où il va lire sa propre production, ce qui rend le fichier de croître jusqu'à ce que tout l'espace disponible est rempli.

Essayez par vous-même:

exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3

(avertissement: le tuer après un certain temps ou il va remplir le système de fichiers)

En outre, il est très dangereux de modifier les fichiers de cette façon, et c'est très mauvais conseils, comme si quelque chose se passe alors que le fichier est en cours de modification (crash de disque plein), vous êtes presque assuré d'être de gauche avec le fichier dans un état incohérent.

16voto

ehdr Points 578

Il peut être intéressant de noter que c'est souvent une bonne idée pour générer en toute sécurité le fichier temporaire à l'aide d'un utilitaire comme mktemp, au moins si le script ne sera jamais exécuté avec les privilèges de root. Par exemple, vous pouvez effectuer les opérations suivantes (à nouveau en bash):

(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X