sed:捕获组不扩展

时间:2014-10-01 19:19:24

标签: regex sed

有人可以向我解释为什么我的sed命令无效吗?我确定我做的事情很愚蠢。这是一个小文本文件,用于演示我的问题:

#!/usr/bin/env python

class A:
    def candy(self):
        print "cane"

将其放入文件中并将其命名为test.py

我的目标是在def行之前添加@profile,并使用与函数声明相同的缩进。我试着用这个:

$ sed -i '/\(  *\)def /i \
\1@profile' test.py

请注意,捕获组应该是def之前的空格集,我用\ 1引用该组。

这是我的结果:

#!/usr/bin/env python

class A:
1@profile
    def candy(self):
        print "cane"

为什么1按字面意思放在那里而不是被我的捕获组(四个空格)替换?

谢谢!

3 个答案:

答案 0 :(得分:2)

我不知道这是真的,但我会假设sed不会保留地址选择器的捕获和手动插入的文本,实际上可能根本不会评估“文字”文本中的引用。

请尝试sed -e 's/\( *\)def /\1@profile\n&/' test.py

答案 1 :(得分:1)

那是怎么回事:

sed -i -e  's/^\(.*\)\(def.*\)/\1@profile\n\2/' test.py

答案 2 :(得分:0)

只需使用awk:

$ awk '{orig=$0} sub(/def.*/,"@profile"); {print orig}' file
#!/usr/bin/env python

class A:
    @profile
    def candy(self):
        print "cane"

简单,便携,易于扩展,可调试等等....