Come aggiungere più righe a un file


301

Sto scrivendo uno script bash per cercare un file se non esiste, quindi crearlo e aggiungerlo ad esso:

Host localhost
    ForwardAgent yes

Quindi "line then new line 'tab' then text"penso che sia un formato sensibile. So che puoi farlo:

cat temp.txt >> data.txt

Ma sembra strano fin dalle sue due linee. C'è un modo per aggiungerlo in questo formato:

echo "hello" >> greetings.txt

Risposte:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

Se sudo (altri privilegi dell'utente) è necessario per scrivere nel file, usare questo:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@TheLegend Questo si chiama "documento qui". Dai un'occhiata a quel paragrafo nella pagina man.
Hauke ​​Laging,

1
Un'altra possibilità è ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--

2
@ ott-- Non hai bisogno di una vera subshell (cioè puoi salvare un nuovo processo), questo è abbastanza:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging,

2
qual è la differenza tra EOT ed EOL?
Cikatomo,

15
@cikatomo In cat <<EOTl' EOTè solo una stringa casuale. Potrebbe anche essere cat <<FOO.
Hauke ​​Laging,

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Oppure, se si desidera una scheda letterale (anziché i quattro spazi nella domanda):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Puoi ottenere lo stesso effetto con echo, ma esattamente come varia da implementazione a implementazione, mentre printfè costante.



16

Un altro approccio è usare tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

Alcune righe scelte dalla teepagina man di:

L'utilità tee copia l'input standard nell'output standard, eseguendo una copia in zero o più file.

-a - Aggiunge l'output ai file anziché sovrascriverli.


6

SED può aggiungere una riga alla fine di un file in questo modo:

sed -i '$ a text to be inserted' fileName.file
$seleziona la fine del file, gli adice di aggiungerlo e dopo questo arriva il testo che deve essere inserito. Quindi ovviamente il nome del file.


Fonte: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT == ==========

Questo approccio ha qualche vantaggio in più rispetto ad altre soluzioni?
Sì, questo approccio ha l'ulteriore vantaggio di aggiungere qualsiasi file restituito in una ricerca, come questo: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

Ho usato l'esempio sopra per inserire il tag html finale che mancava in ogni pagina html in un numero di directory.

===================================


1
Se mostrassi la sintassi per aggiungere più righe a un file, questa sarebbe una risposta alla domanda (anche se non molto utile). Tutte le altre risposte scrivono semplicemente il nuovo testo. Questa risposta legge l'intero file e lo riscrive, oltre al testo aggiunto. Questo approccio ha qualche vantaggio rispetto agli altri?
G-Man,

Funziona solo con GNU sed. BSD sedballe con l'errore: command a expects \ followed by text. Quindi non usarlo per una soluzione con script; può rompersi. (O farlo correttamente poiché la sintassi richiesta da BSD è compatibile POSIX e funzionerà anche su GNU sed.
Wildcard

Le altre risposte possono essere utilizzati con findle seguenti: find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man,

1
Questa è un'ottima soluzione, in quanto non esegue il reindirizzamento del flusso ( >, >>) e quindi non soffre di problemi come l'esecuzione sudo echo 'something' > /file. Per me è perfettamente permette di aggiungere una riga in un file in un contenitore LXD così: lxc exec c sed -- '$ a newline' /myfile.
Draco Ater,

Il echo "a new line" >> foo.filenon creerà una nuova linea quando il file non è fine della nuova linea, ma sed -i '$ a a new line' foo.filelo farà, quindi sedè meglio soprattutto si vuole sempre appendere una nuova riga al file.
Zhouji,

1

Ho usato sed perché può essere usato con sudo. Per esempio:

sudo sed -i '$ a text to be inserted' fileName.file 

l'alternativa è molto brutta come:

sudo bash -c "echo a text to be inserted >> fileName.file"  

e ancora più brutto quando fatto con ssh.


1
Perché questa risposta è stata sottoposta a downgrade? Questa sembra la soluzione di cui ho bisogno. C'è qualche problema con esso? In caso contrario, lo userò e lo voterò.
MountainX,

Non sed -iprendi un'estensione come argomento? Il tuo esempio potrebbe avere parametri errati.
protometa,

1

Un altro liner è:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Preferirei l' -eopzione pensata, in quanto offre un maggiore controllo:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

1

Si può emulare cat >> out.txtcon Perl o Python per ottenere lo stesso effetto. Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

E Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Nota che per Python dovrai premere Ctrl+ Ddue volte. Vedi la domanda correlata su StackOverflow per maggiori informazioni.


1

Ecco un esempio per aggiungere più righe in un file:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

Oltre alla risposta principale, nel caso in cui il file abbia bisogno di autorizzazioni super utente, l'aggiunta sudodi fronte echonon funzionerà.

Questo perché la shell rompe i comandi e sebbene sia stata echoeseguita come root, ma >>con normali privilegi.

Questo funzionerà per super user: sudo su -c "echo 'Line 3' >> greetings.txt"


Non hai bisogno del suqui ( sudo sunon va bene). Ma hai ragione nel dire che hai bisogno di qualcosa per gestire il reindirizzamento della shell; forse sudo sh -c "echo stuff >> file.txt". Nessun risparmio netto ma una pratica migliore.
roaima,
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.