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.

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.


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


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

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

J'utilise depuis cat << 'EOF' >des années et je ne savais pas comment cat << 'EOF' >>ajouter! Merci
FreeSoftwareServers
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.