用于删除文件上的许可证前导码的脚本语言

时间:2011-12-07 15:29:15

标签: python regex perl

我想以递归方式取代“等等等等” 在我的许可区域中没有任何内容:

#region License
blah blah blah
blah blah blah
#endregion

应替换为

#region License
#endregion

这应该适用于某个目录中的所有.cs文件(递归)。我用sed尝试了这个,但是因为我在windows上,所以我遇到了一些行结尾的问题。我怎么能用perl(或python)或者windows的原生代码呢?

编辑:这是我提出的解决方案,感谢大家!:

#/bin/bash
list=`find . -name '*.cs' -o -name '*.h' -o -name '*.cpp'` 
for i in $list 
do
perl -i~ -ne 'if (/#region License/../#endregion/) {print if /#(?:end)?  region/;next};print' $i 
done

7 个答案:

答案 0 :(得分:6)

这样的东西?

perl -i~ -pe 'undef $_ if /^#region License$/ .. /^#endregion$/'

答案 1 :(得分:1)

#!/usr/bin/env python

with open('input') as fd:
    text=fd.read()

old="""#region License
blah blah blah
blah blah blah
#endregion

"""

new="""#region License
#endregion

"""

print text.replace(old,new)

添加一些os.walk来遍历目录,并将结果写入stdout或用新内容替换原始文件。参见例如https://stackoverflow.com/a/5421671/297323

答案 2 :(得分:1)

perl -ne 'if (/#region/../#endregion/) {print if /#(?:end)?region/;next};print' file

...按要求在输出中留下“#region license”和“#endregion”行。

答案 3 :(得分:1)

exvim -e)也许是个不错的选择。

echo -e 'g/^#region License$/+1,/^#endregion$/-1d\nx' | ex program.cs

  • g/.../+1,/.../-1 =>找到正则表达式之间的行(+1 =>下面一行,-1 =>上面一行)
  • d =>删除
  • \n => 输入
  • x =>保存并退出

在Windows中,请使用:

vim -c "g/^#region License/+1,/^#endregion/-1d" +x program.cs

答案 4 :(得分:0)

读取文件的行,如果行以#region开始跳过下一行,则跳过每一行,如果行以#endregion结束,则再次开始收集行,将最后一行输出到文件中,例如。

def filter_lines(lines):
    newlines = []
    startmarker = '#region'
    endmarker = '#endregion'
    skip = False
    for line in lines:

        if line.startswith(startmarker):
            newlines.append(line)
            skip = True
            continue
        if line.endswith(endmarker):
            skip = False

        if not skip: newlines.append(line)

    return newli

未列名

答案 5 :(得分:0)

python,如果许可证主体在各种不可预测的方式上都是不同的:

#!/usr/bin/env python

with open('input') as fd:
    text=fd.read()

try:
    start, rest = text.split("#region License\n", 1)
    middle, end = rest.split("#endregion\n", 1)
    print "%s\#region License\n#endregion\n%s" % (start, end)
except ValueError:
    # didn't contain a properly formatted license:
    print text

答案 6 :(得分:0)

我会做这样的事情:

perl -i.orig -0777 -p -e 's/#region License.*?#endregion/#region License\n#endregion/s' test.cc
  • -0777表示整个文件将被诽谤
  • -p使-e代码被while(<>){... print $ _}块包围
  • -i.orig进行编辑,并创建备份
  • 替换结束时的
  • 标志使得regexp中的。*与eol相匹配

使用find确定要处理的文件