我正在探索从python 2到3移植一个大项目。
因为我目前只是在测试,还有其他一些原因。我改为改变所有
#!/usr/bin/python
or
#!/usr/bin/env python
or
#!/usr/bin/env python2.6
到python3。除此之外,我希望添加两个换行符和一个评论。因此,以上述其中一个开头的每个python文件现在都以:
开头#!/usr/bin/env python3
# 4 spaces is the indentation standard. Make sure that Tab equals 4 spaces.
我当前的代码将遍历所有目录并一次更改一个python文件以及此更改和其他一些更改。我的问题在于以下功能:
def usePy3_addcomment(filename):
try:
subprocess.check_call(['sed','-i.sedbak','s_#!/usr/bin/.*python.*_#!/usr/bin/env python3\n\n# 4 spaces is the indentation standard. Make sure that Tab equals 4 spaces._',filename])
except:
print("ERROR: usePy3_addcomment failed on '%s'" % filename)
return None
问题在于\ n。他们被留在这里表达我想做的事情。我尝试使用endline文字,使用括号并添加\,但无济于事。
错误信息是:
$sed: -e expression #1, char 48: unterminated `s' command
答案 0 :(得分:0)
我在GNU / Linux终端中运行sed -ir 's:(#!/usr/bin/).*python.*:\1env python 3\n\n# Comment\n:'
并且运行正常。如果在find . -name "*.py" -exec
命令之前添加[sed
],它应该递归遍历,找到所有python文件并应用替换。
很明显,Python在运行\n
到sed
时遇到了麻烦所以我建议在实际的终端中运行sed
,除非您必须在Python中运行它。如果是这种情况,请告诉我,我将尝试通过Python而不是通过终端来实现。
将s ///部分保存为sed_script.sed
:
s_#!/usr/bin/.*python.*_#!/usr/bin/env python3\n\n# 4 spaces is the indentation standard. Make sure that Tab equals 4 spaces._
然后运行
subprocess.call(['sed','-i','-f', "sed_script.sed",filename])
应该使用filename
编辑sed_script.sed
并替换您想要的部分