Comment ajouter du texte à un fichier?

109

Quelle est la manière la plus simple d'ajouter du texte à un fichier sous Linux?

J'ai jeté un œil à cette question , mais la réponse acceptée utilise un programme supplémentaire ( sed) Je suis sûr qu'il devrait y avoir un moyen plus simple avec echoou similaire.

Dchris
la source

Réponses:

125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Essentiellement, vous pouvez vider le texte de votre choix dans le fichier. CTRL-D envoie un signal de fin de fichier, qui termine l'entrée et vous renvoie au shell.

Jon Kiparsky
la source
2
Comment puis-je faire cela lorsque le fichier a besoin d'une autorisation root?
UselesssCat
2
@UselesssCat quand quelque chose devient "permission refusée", je revérifie la commande que j'exécute puis j'utilise sudo !!- qui exécute la dernière commande avec le sudopréfixe. J'ai récemment découvert que cela fonctionne également avec nanoetc (en essayant accidentellement de nano nano auth...)
Sandra
si vous avez besoin d'utiliser sudo ou de l'utiliser dans un script, reportez-vous à mon suivi de cette réponse acceptée ci-dessous.
user12345
4
Je ne savais pas que le chat pouvait être utilisé comme ça! Comme écrire une entrée de journal. Je ne savais pas non plus ce que fait ctrl-d. Je vous remercie!
houallet
1
@Sandra - Je n'ai pas utilisé !!avant, génial. Très souvent, je fais des trucs comme cat /var/log/apache/error.loget je me fais refuser la permission. Cela pourrait également être fait avec un identifiant de l'historique, par exemple sudo !1419, cela exécutera la commande en ligne 1419dans l'historique en tant que sudo.
Cyclonecode
172

Que diriez-vous:

echo "hello" >> <filename>

L'utilisation de l' >>opérateur ajoutera des données à la fin du fichier, tandis que l'utilisation de la >remplacera le contenu du fichier s'il existe déjà.

Vous pouvez également utiliser printfde la même manière:

printf "hello" >> <filename>

Notez qu'il peut être dangereux d'utiliser ce qui précède. Par exemple, si vous avez déjà un fichier et que vous devez ajouter des données à la fin du fichier et que vous oubliez d'ajouter la dernière, >toutes les données du fichier seront détruites. Vous pouvez modifier ce comportement en définissant la noclobbervariable dans votre .bashrc:

set -o noclobber

Maintenant, lorsque vous essayez de le faire, echo "hello" > file.txtvous recevrez un avertissement cannot overwrite existing file.

Pour forcer l'écriture dans le fichier, vous devez maintenant utiliser la syntaxe spéciale:

echo "hello" >| <filename>

Vous devez également savoir que, par défaut, echoajoute un caractère de fin de ligne qui peut être supprimé à l'aide de l' -nindicateur:

echo -n "hello" >> <filename>

Références

Cyclonecode
la source
4
En général, j'aime plus cela que la réponse acceptée qui utilise cat, mais vous feriez mieux de faire attention à utiliser à la >>place de >!
sixty4bit
@ sixty4bit - Tout à fait d'accord, mais je pense que vous devez toujours savoir ce que vous faites lorsque vous travaillez avec un shell, sinon vous pourriez faire quelque chose comme sudo rm -r /=)
Cyclonecode
1
mieux sudo rm -r /que sudo rm -rf /! ^ _ ^ Y a-t-il un indicateur qui demanderait une confirmation avant d'écraser le contenu d'un fichier existant avec >? Aliaser que de toujours utiliser un tel drapeau semble être une bonne idée.
sixty4bit le
2
@ sixty4bit - Vous pouvez ajouter set -o noclobberdans votre .bashrcalors vous ne pouvez pas écraser un fichier existant sans utiliser la syntaxe spécialeecho "hello" >| <filename>
Cyclonecode
pouvez-vous donner un exemple où le fichier est appelé, dites "myFile.txt" ou quelque chose? Je ne sais pas si c'est <filename> ou le nom de fichier dans votre exemple
bharal
24

L'autre moyen possible est:

echo "text" | tee -a filename >/dev/null

Le -asera ajouté à la fin du fichier.

Si besoin sudo, utilisez:

echo "text" | sudo tee -a filename >/dev/null
user9869932
la source
Pourquoi le> / dev / null à la fin?
Quadrivium
1
Le >/dev/nullà la fin empêche le "texte" d'être affiché dans votre console.
user9869932
13

Suivi de la réponse acceptée.

Vous avez besoin d'autre chose que CTRL-D pour désigner la fin si vous l'utilisez dans un script . Essayez plutôt ceci:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Cela ajoutera du texte au fichier indiqué (non compris "EOF").

Il utilise un document ici (ou heredoc) .

Cependant, si vous avez besoin d'ajouter sudo au fichier indiqué, vous rencontrerez des problèmes lors de l'utilisation d'un heredoc en raison de la redirection d'E / S si vous tapez directement sur la ligne de commande.

Cette variante fonctionnera lorsque vous tapez directement sur la ligne de commande:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Ou vous pouvez utiliser à la teeplace pour éviter le problème sudo de ligne de commande vu lors de l'utilisation de heredoc avec cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF
user12345
la source
J'utilise depuis cat << 'EOF' >des années et je ne savais pas comment cat << 'EOF' >>ajouter! Merci
FreeSoftwareServers