sed / find / grep如果没有,在文件顶部附加c#注释,如果存在则替换

时间:2018-12-29 23:47:08

标签: sed grep

我有一个版权条款,我想将其附加到目录中一堆文件的顶部作为注释(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中将斜杠和星号用于其他用途,因此很难使用。 这是我的findsed的总和。这会将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

2 个答案:

答案 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,并根据文件的第一行切换处理。