使用 SED 和/或 AWK 用模式替换行

使用 SED 和/或 AWK 用模式替换行

这是输入文件

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

相关内容