2013-07-17 7 views
8

Próbowałem napisać skrypt, aby dodać nagłówek znaku towarowego do mojego pliku .cpp. moje rozwiązanie jest następujące.Skrypt powłoki, aby dodać nagłówek do pliku

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

Chciałem jednak wiedzieć, czy jest lepszy sposób na zrobienie tego.

+3

To, co już robisz, jest słuszne. –

Odpowiedz

3

Można użyć awk tak:

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

Korzystanie vim/vi:

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

Korzystanie GNU sed:

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

Korzystanie zakaz GNU sed:

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

Dzięki za pokazanie miłego sposobu korzystania z awk. jednak wypisze go na standardowe wyjście, ale "mainFile" nie zostanie zmodyfikowany. – Jack

+1

To prawda, stdout musi zostać przekierowany do pliku. – anubhava

+0

tak. próbowałem przekierować go do pliku. ale w takim przypadku nadpisuje plik mainfile plikiem nagłówkowym – Jack

1

zostały już zaakceptowane odpowiedź, ale ja proponuję jeszcze jeden sposób:

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

Dobra, trochę podobna do tej, którą mam: sed--i.bak -e '2 {x; G}; 1 {h; rheaderFile' -e 'd}' mainFile' – anubhava

+0

Chciałem się pozbyć &&. Twoja odpowiedź właśnie to robi. Dziękuję bardzo. – Jack

+2

@Jack dlaczego chcesz pozbyć się '&&'? Czy podejście, od którego zacząłeś, nie jest tak wyraźne, jak żadna z otrzymywanych sugestii? –

0

Jeśli używasz vim, sprawdź ultisnips . Może to zrobić i jeszcze więcej.

przykład mam następujący fragment zdefiniowany, aby dodać nagłówek domeny publicznej do pliku:

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 

Aby skorzystać z tego fragmentu, wstawić pd na początku linii w vim i uderzył <tab>. Spowoduje to rozwinięcie fragmentu, wpisanie bieżącej daty w tagu $Date$ i wypełnienie nazwy pliku (przy użyciu expand). Następnie podświetla nazwę autora, która jest pierwszą zmienną, co pozwala mi ją zmienić, jeśli to konieczne. To automatycznie zmienia wszystkie kolejne wystąpienia tej zmiennej. Korzystanie z <ctrl>j przenosi mnie do następującej zmiennej, adres e-mail autora, który można również zmienić w razie potrzeby.

Można użyć poleceń vimscript (między cudzysłowami i poprzedzonych przez !v). Jeśli twój vim jest skompilowany z obsługą Pythona, możesz również użyć kodu Python z !p.