我想以递归方式取代“等等等等” 在我的许可区域中没有任何内容:
#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
答案 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)
ex
(vim -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
使用find确定要处理的文件