2013-07-17 80 views
8

我试图编写一个脚本来向我的.cpp文件添加一个商标标题。 我的解决方案如下。将脚本添加到文件的shell脚本

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

但是,想知道是否有更好的方法来做到这一点。

+3

你现在正在做的事情是正确的。 –

回答

3

您可以用awk像这样:

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

使用vim/VI:

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

使用GNU sed的:

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

使用非GNU的sed:

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

感谢您展示使用awk的好方法。然而,它将它打印到标准输出,但“mainFile”不会被修改。 – Jack

+1

这是正确的,标准输出需要被重定向到一个文件。 – anubhava

+0

是的。我试着重定向到文件。但在这种情况下,它会用headerfile覆盖mainFile – Jack

1

您已接受的答案,但我会建议另一种方式:

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

好的,有点类似我有的:'sed -i。bak -e'2 {x; G}; 1 {h; rheaderFile'-e'd}'mainFile' – anubhava

+0

我想摆脱&&。而你的答案正是那样做的。非常感谢。 – Jack

+2

@Jack为什么你想摆脱'&&'?你开始的方法是不是比你所得到的任何建议都要清晰得多? –

0

如果你使用vim,请ultisnips 。它可以做到这一点,更多。

例如,我已经定义了下面的代码片段到公共领域头添加到文件:

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 

要使用这个片段,我在VIM一行的开头插入pd和命中<tab>。这将展开代码段,在$Date$标记中填写当前日期,并填充文件名(使用expand)。然后突出显示作者的姓名,这是第一个变量,允许我在必要时更改它。这会自动更改该变量的所有其他实例。使用<ctrl>j将我带到以下变量中,作者的电子邮件地址,如果需要也可以更改它。

您可以使用vimscript命令(在引号之间,前加!v)。如果你的vim是用Python支持编译的,你也可以使用!p的Python代码。