我有一个版权条款,我想将其附加到目录中一堆文件的顶部作为注释(C#)。看起来像这样:
/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/
/*C Use, duplication, or disclosure of this software and T*/
/*C related documentation is blah blah blah blah T*/
/*C Copyright 2004 - 2018 COMPANY T*/
/*C All rights reserved. T*/
/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/
一些文件已经包含一个子句,但是要确定日期为2017或2016,我要确保该子句中的日期设置为2018。如果没有任何子句,我想插入一个子句。
到目前为止,我已经实现了find
以便仅修改目录中所需的文件:
find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) -prune -o -type f \( -name "*.java" -o -name "*.cs" -o -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" -o -name "*.c" -o -name "*.h" -o -name "*.scala" -o -name "*.css" -o -name "*.js" \) -print0
因为此子句是每个文件顶部的注释,所以它以/*...*/
开头和结尾。我尝试使用sed
,但由于在sed
中将斜杠和星号用于其他用途,因此很难使用。
这是我的find
和sed
的总和。这会将2017年的所有实例替换为2018年,并追加该子句,但是即使该子句已经存在,也将其追加。如果不存在,我只需要附加它即可。
find ....... -print0 | xargs -0 sed -i 's/2004 - 2017/2004 - 2018/g; 1s/^/\/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*\/\n\/*C Use, duplication, or disclosure of this software and.....etc'
在grep或sed中是否有更好的方法?谢谢 编辑:我正在使用CYGWIN
答案 0 :(得分:0)
grep适用于private void LoginUser(string email, string password){
if (input_password.Text == reinput_password.Text){
auth.CreateUserWithEmailAndPassword(email, password)
.AddOnCompleteListener(this, this);
auth.sendEmailVerification(email)
.AddOnCompleteListener(this, this);
}
}
,而sed适用于g/re/p
,因此这两种工具都不适合您的问题。
这应该使用GNU awk(在cygwin上具有)完成您想要的工作:
s/old/new
如果文件开头已经存在旧的版权块,它将仅用新的版权块替换整个版权块。如果您想要在文本上进行更精确的匹配以指示注释块的开始和结束,可以将每个find ... -exec awk -i inplace '
FNR==1 {
print "/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/"
print "/*C Use, duplication, or disclosure of this software and T*/"
print "/*C related documentation is blah blah blah blah T*/"
print "/*C Copyright 2004 - 2018 COMPANY T*/"
print "/*C All rights reserved. T*/"
print "/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/"
if ( /COPYRIGHT/ ) { inCopy=1 }
next
}
inCopy && /COPYRIGHT/ { inCopy=0 }
!inCopy
' {} +
更改为/COPYRIGHT/
。
答案 1 :(得分:0)
请尝试:
find ... -print0 | while read -r -d $'\0' f; do
if [[ $(head -1 "$f") = "/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/" ]]; then
sed -i 's/2004 - 2017/2004 - 2018/g' "$f"
else
sed -i '1s#^#/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/\n/*C Use, duplication, or disclosure of this software and.....etc */\n#' "$f"
fi
done
它将find
的结果传递给xargs
循环,而不是传递给while
,并根据文件的第一行切换处理。