2013-07-17 16 views
8

Stavo cercando di scrivere uno script per aggiungere un'intestazione di marchio al mio file .cpp. la mia soluzione è la seguente.script di shell per aggiungere un'intestazione a un file

cat trademark.txt test.cpp > new_test.cpp && mv new_test.cpp test.cpp 

Tuttavia, voleva sapere se c'è un modo migliore per farlo.

+3

Quello che stai già facendo è esattamente la cosa giusta da fare. –

risposta

3

È possibile utilizzare awk in questo modo:

awk 'NR==FNR && !h {print;h=1;} NR!=FNR{print}' headerFile mainFile > tmpFile 
mv tmpFile mainFile 

Utilizzando vim/VI:

vim +'0r headerFile|wq' mainFile 2>/dev/null 

Utilizzando GNU sed:

sed -i.bak -e '2{x;G};1{h;rheaderFile' -e 'd}' mainFile 

Utilizzando non GNU sed:

HDR=$(head -1 headerFile) && sed -i.bak "1s/^/$HDR/" mainFile 
+0

Grazie per aver mostrato il bel modo di usare awk. tuttavia, lo stampa su stdout ma il "mainFile" non viene modificato. – Jack

+1

Questo è corretto, lo stdout deve essere reindirizzato a un file. – anubhava

+0

si. ho provato a reindirizzarlo al file. ma in questo caso, sovrascrive mainFile con file di titolo – Jack

1

Hai già accettato una risposta, ma io suggerisco un altro modo:

sed -i -e '1r trademark.txt' -e '1{x;d;};2{H;g;}' test.cpp 
+0

Buono, un po 'simile a quello che ho: 'sed -i.bak -e '2 {x; G}; 1 {h; rheaderFile' -e 'd}' mainFile' – anubhava

+0

Volevo sbarazzarmi di &&. E la tua risposta lo fa esattamente. grazie mille. – Jack

+2

@Jack perché vuoi sbarazzarti di '&&'? L'approccio che hai iniziato non sembra più chiaro di tutti i suggerimenti che ricevi? –

0

Se stai usando vim, check out ultisnips . Può fare questo, e molto più.

esempio ho definito il seguente frammento per aggiungere un'intestazione di dominio pubblico in un file:

snippet pd "Public domain dedication" b 
# 
# Author: ${1:Roland Smith} ${2:<[email protected]>} 
# \$Date: `!v strftime("%F %T %z")` \$ 
# 
# To the extent possible under law, $1 has waived all copyright and 
# related or neighboring rights to `!v expand('%:t')`. This work is published 
# from the Netherlands. See http://creativecommons.org/publicdomain/zero/1.0/ 

endsnippet 

Per utilizzare questo frammento di codice, inserisco pd all'inizio di una riga in vim e colpito <tab>. Questo espande lo snippet, riempiendo la data corrente nel tag $Date$ e inserisce il nome file (usando expand). Evidenzia quindi il nome dell'autore, che è la prima variabile, permettendomi di cambiarla se necessario. Questo cambia automaticamente tutte le ulteriori istanze di quella variabile. L'utilizzo di <ctrl>j mi porta alla seguente variabile, l'indirizzo email dell'autore, che può anche essere modificato se lo si desidera.

È possibile utilizzare i comandi di vimscript (tra virgolette e anteposto da !v). Se il tuo vim è compilato con il supporto di Python puoi anche usare il codice Python con !p.