Come aggiungo testo a un file?


109

Qual è il modo più semplice per aggiungere testo a un file in Linux?

Ho dato un'occhiata a questa domanda , ma la risposta accettata utilizza un programma aggiuntivo ( sed) Sono sicuro che dovrebbe esserci un modo più semplice con echoo simile.

Risposte:


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

In sostanza, puoi scaricare qualsiasi testo tu voglia nel file. CTRL-D invia un segnale di fine file, che termina l'input e ti riporta alla shell.


2
Come posso farlo quando il file necessita dell'autorizzazione di root?
UselesssCat

2
@UselesssCat quando qualcosa va "permesso negato", ricontrollo il comando che sto eseguendo e poi uso sudo !!- che esegue l'ultimo comando con sudoanteposto. Recentemente ho scoperto che funziona anche con nanoecc (cercando accidentalmente di nano nano auth...)
Sandra

se è necessario utilizzare sudo o utilizzarlo in uno script, fare riferimento al mio seguito a questa risposta accettata di seguito.
user12345

4
Non sapevo che il gatto potesse essere usato in questo modo! Come scrivere una voce di diario. Inoltre non sapevo cosa fa ctrl-d. Grazie!
houallet

1
@Sandra - Non l'ho usato !!prima, fantastico. Così spesso faccio cose come cat /var/log/apache/error.loge ottengo il permesso negato. Questo potrebbe anche essere fatto con un id dalla cronologia sudo !1419, ad esempio , questo eseguirà il comando alla riga 1419nella cronologia come sudo.
Cyclonecode

172

Che ne dite di:

echo "hello" >> <filename>

L'utilizzo >>dell'operatore aggiungerà i dati alla fine del file, mentre utilizzando il >sovrascriverà il contenuto del file se già esistente.

Puoi anche usare printfallo stesso modo:

printf "hello" >> <filename>

Nota che può essere pericoloso utilizzare quanto sopra. Ad esempio, se hai già un file e devi aggiungere dati alla fine del file e dimentichi di aggiungere l'ultimo, >tutti i dati nel file verranno distrutti. Puoi modificare questo comportamento impostando la noclobbervariabile nel tuo .bashrc:

set -o noclobber

Ora, quando proverai a farlo echo "hello" > file.txt, riceverai un avviso che dice cannot overwrite existing file.

Per forzare la scrittura sul file è ora necessario utilizzare la sintassi speciale:

echo "hello" >| <filename>

Dovresti anche sapere che di default echoaggiunge un carattere di nuova riga finale che può essere soppresso utilizzando il -nflag:

echo -n "hello" >> <filename>

Riferimenti


4
In generale, questo mi piace più della risposta accettata che utilizza cat, ma faresti meglio a stare attento assicurandoti di usare >>invece di >!
sixty4bit

@ sixty4bit - Totalmente d'accordo, ma penso che devi sempre sapere cosa stai facendo quando lavori con una shell, altrimenti potresti fare qualcosa come sudo rm -r /=)
Cyclonecode

1
meglio sudo rm -r /di sudo rm -rf /! ^ _ ^ C'è un flag che chiederebbe conferma prima di sovrascrivere il contenuto di un file esistente con >? Aliasing che usare sempre una tale bandiera sembra che sarebbe una buona idea.
sixty4bit

2
@ sixty4bit - Puoi aggiungere il set -o noclobbertuo .bashrcquindi non puoi sovrascrivere un file esistente senza utilizzare la sintassi specialeecho "hello" >| <filename>
Cyclonecode

puoi fare un esempio in cui il file viene chiamato, ad esempio "myFile.txt" o qualcosa del genere? Non sono sicuro che sia <filename> o il nome del file nel tuo esempio
bharal

24

Un altro modo possibile è:

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

Il -aaggiungerà alla fine del file.

Se necessario sudo, usa:

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

Perché> / dev / null alla fine?
Quadrivium

1
Alla >/dev/nullfine impedisce che il "testo" venga mostrato nella tua console.
user9869932

13

Follow-up alla risposta accettata.

Hai bisogno di qualcosa di diverso da CTRL-D per designare la fine se lo usi in uno script . Prova questo invece:

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

Questo aggiungerà testo al file indicato (escluso "EOF").

Utilizza un here document (o heredoc) .

Tuttavia, se hai bisogno di sudo da aggiungere al file indicato, ti imbatterai in problemi nell'utilizzo di heredoc a causa del reindirizzamento I / O se stai digitando direttamente sulla riga di comando.

Questa variazione funzionerà quando digiti direttamente dalla riga di comando:

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

Oppure puoi usare teeinvece per evitare il problema sudo della riga di comando visto quando usi heredoc con cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

Lo uso cat << 'EOF' >da anni e non sapevo cat << 'EOF' >>di aggiungere! Grazie
FreeSoftwareServers
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.