有人可以向我解释为什么我的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
按字面意思放在那里而不是被我的捕获组(四个空格)替换?
谢谢!
答案 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"
简单,便携,易于扩展,可调试等等....