我试图编写一个脚本来将商标头添加到我的 .cpp 文件中。我的解决方案如下。
cat trademark.txt test.cpp > new_test.cpp && mv new_test.cpp test.cpp
但是,想知道是否有更好的方法来做到这一点。
您可以像这样使用 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
您已经接受了答案,但我会建议另一种方法:
sed -i -e '1r trademark.txt' -e '1{x;d;};2{H;g;}' test.cpp
如果您使用的是 vim,请查看ultisnips。它可以做到这一点,甚至更多。
例如,我定义了以下代码片段来将公共域标头添加到文件中:
snippet pd "Public domain dedication" b
#
# Author: ${1:Roland Smith} ${2:<myemail@mydomain.com>}
# \$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
要使用这个片段,我pd
在 vim 的行首插入并点击<tab>
. 这会扩展代码段,在标签中填写当前日期$Date$
,并填写文件名(使用expand
)。然后它会突出显示作为第一个变量的作者的姓名,允许我在必要时更改它。这会自动更改该变量的所有其他实例。使用<ctrl>j
将我带到以下变量,作者的电子邮件地址,如果需要,也可以更改。
您可以使用 vimscript 命令(在引号之间并由 前置!v
)。如果你的 vim 是用 Python 支持编译的,你也可以使用 Python 代码和!p
.