这是输入文件
def test():
print('do something')
#>#> this does something
return 0
def new_test(arg):
# >#>this too does something
x = 0
y = 1
return x+y
def main():
test()
z = 'hello'
# ># this should not work
return null
if __name__ == '__main__':
# >#> main call
main()
输出应如下所示:
def test():
print('do something')
some_fn("this does something")
return 0
def new_test(arg):
some_fn("this too does something")
x = 0
y = 1
return x+y
def main():
test()
z = 'hello'
# ># this should not work
return null
if __name__ == '__main__':
some_fn("main call")
main()
我找不到提取评论字符串的方法。
答案1
有了标准sed
,你会像这样:
sed 's/# *>#> *\(.*\)/some_fn("\1")/' file
- 你的
#>#>
模式似乎允许一些额外的空间,所以我用作# *>#> *
模式。如果其他空间允许,请进行调整。 .*
与该行的其余部分匹配。我把它放在里面\(\)
,所以我可以在替换中将其引用为\1
答案2
GNU sed
您可以使用和 扩展正则表达式选项 来快速完成此操作-E
。
$ sed -Ee 's/^(\s+)#\s*>#>\s*(\S.*)/\1some_fn("\2")/' file
- ^(\s+) 将记住缩进级别
- # 和 >#> 是两个字符串,后面可以选择跟空格。
- (\S.*) 存储消息部分
- 然后在替换部分,我们回顾缩进级别
\1
和消息\2
,并散布字符串 some_fn
或者,使用awk
,我们选择字段分隔符作为正则表达式#\s*>#>\s*
,这样$1
消息的缩进级别就是$2
$ awk '
BEGIN {
s = "[[:blank:]]*"
FS = "#" s ">#>" s
OFS = ""; q = "\""
}
NF > 1 {
$2 = "some_fn(" q$2q ")"
}1
' file