.c
我正在寻找一个 shell 脚本(Bash),它可以在文件(for和.h
files)的开头添加或替换版权文本。
它应该搜索并添加或替换我执行脚本的父目录中的所有.c
和文件的版权文本块。.h
现有版权文本:
/* --------------------------------------------------
Copyright 2014 Author name
All rights reserved
----------------------------------------------------*/
新的版权文本。
/* Copy right text bla bla bla
* some license text bla bla bla
* All rights reserved xyz xyz */
笔记
版权文本应仅添加在文件的开头 (
.c
和.h
),并且现有的版权文本始终位于文件的开头。它应该搜索并添加或替换父目录和子目录中的所有
.c
和文件。.h
编辑
这是我尝试过的:
for file in `find . -type f -name "*.h"`
do
echo $file
if grep -qRin " ----------------------------------------------------------------------\*\/" $file
then
echo "Replaced License Text"
sed '1,/^ ----------------------------------------------------------------------\*\/$/d' < $file | cat licence_file - > $file.new
mv $file.new $file
else
cat licence_file $file >$file.new && mv $file.new $file
echo "Added License Test"
fi
done
License_file 包含我的新许可证文本。
答案1
ed
是“标准文本编辑器”。对于日常编辑来说它并不是很理想,但它是易于编写脚本。
ed file.c <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
* some license text bla bla bla
* All rights reserved xyz xyz */
.
w
q
EOF
第一个命令从第一行开始删除,直到包含 a 的第一行*/
(the*
和 the都/
需要转义)。第二个命令是一个简单的插入 - 告诉i
进入ed
“插入”模式,而 a.
本身告诉ed
退出插入模式。w
表示“写入”,并保存文件;q
意思是“退出”。整个事情都在一个“here-document”中,它以一个开头和结尾EOF
(这是任意的;您可以使用任何您想要的字符串)。
这可以很容易地在循环中使用:
for f in ./*.{c,h}; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
* some license text bla bla bla
* All rights reserved xyz xyz */
.
w
q
EOF
done
如果您想要递归性(即在子目录中工作),请在上面的命令中使用shopt -s globstar
和使用,或者使用while 循环:./**/*.{c,h}
find
find . -name '*.c' -name '*.h' -print0 | while read -d '' f; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
* some license text bla bla bla
* All rights reserved xyz xyz */
.
w
q
EOF
done
如果您可能多次执行此操作,则可能值得将其放入脚本中。
#!/bin/sh
ed "$1" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
* some license text bla bla bla
* All rights reserved xyz xyz */
.
w
q
EOF
如果您将其命名为copyright.sh,将其放入$PATH 中的某个位置,并使其可执行,那么您可以简单地:
shopt -s globstar
for f in ./**/*.{c,h}; do copyright.sh "$f"; done
答案2
有点乱,但是这个 python 可以工作:
#!/usr/bin/python
import sys
filename = sys.argv[1]
fo=open(filename,'r+')
fr=fo.read()
frs=fr.replace('/* --------------------------------------------------\n Copyright 2014 Author name\n\n All rights reserved\n ----------------------------------------------------*/','/* Copy right text bla bla bla\n* some license text bla bla bla\n* All rights reserved xyz xyz */')
fo.seek(0,0)
fo.write(frs)
fo.close()
如果原始文本和替换文本是,则此方法有效确切地采用与问题中给出的相同格式(包括连字符线)。使用以下命令从文件所在的目录调用此 python:
for i in ./{*.c,*.h} ; do python <scriptname.py> $i ; done
怎么运行的:
直截了当。它只是打开文件,并将该行中第一对单引号之间给出的行替换frs=fr.replace....
为同一行中第二对单引号中给出的行。