在Python脚本中在SED替换的中间添加换行符
我正在探索将一个大型项目从Python2移植到Python3 因为我现在只是测试,还有其他一些原因。我改变一切在Python脚本中在SED替换的中间添加换行符,python,regex,python-3.x,sed,Python,Regex,Python 3.x,Sed,我正在探索将一个大型项目从Python2移植到Python3 因为我现在只是测试,还有其他一些原因。我改变一切 #!/usr/bin/python or #!/usr/bin/env python or #!/usr/bin/env python2.6 到蟒蛇3号。除此之外,我希望添加两个换行符和一条注释。因此,以上述其中一个开头的每个python文件现在都以以下开头: #!/usr/bin/env python3 # 4 spaces is the indentation standard
#!/usr/bin/python
or
#!/usr/bin/env python
or
#!/usr/bin/env python2.6
到蟒蛇3号。除此之外,我希望添加两个换行符和一条注释。因此,以上述其中一个开头的每个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中。它们放在这里是为了表达我的愿望。我尝试过使用结束行文字,使用括号并添加\,但没有效果
错误消息是:
$sed: -e expression #1, char 48: unterminated `s' command
我在GNU/Linux终端上运行了sed-ir:(#!/usr/bin/).*python.*:\1env-python 3\n\n#Comment\n:',效果很好。如果在sed
命令之前添加[find.-name“*.py”-exec
],它应该递归执行,则查找所有python文件并应用替换
显然Python在通过sed
运行\n
时遇到了麻烦,因此我建议在实际的终端中运行sed
,除非您必须在Python中运行它。如果是这种情况,请告诉我,我将尝试通过Python而不是通过终端来完成
将s///部分另存为sed\u 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])
这应该使用
sed_script.sed
编辑文件名
,并替换所需的部分您可以尝试subprocess.Popen(cmd,shell=True),其中cmd可以作为shell@vks谢谢,但这产生了同样的错误。它没有在我的终端上运行。不喜欢括号和感叹号需要反斜杠。但这不是重点。上面的sed命令在我的终端中运行(带有反斜杠感叹号)。问题是我确实希望用python运行它。我希望在一个python文件上运行autopep8、2to3和sed_函数,然后检查字节码与pydiff的等价性。我甚至不确定在这种处理之后,它们是否会或应该是字节码等效的,但除了“我开始用python做这件事”之外,这就是我用python运行它的原因,char 48:unterminated's命令带或不带反斜杠惊叹号。这可能是因为sed
通常在引号内读取脚本,但由于您通过子进程调用sed
,引号被误解了。也许可以尝试将整个内容保存为sed
脚本并运行该脚本,而不是调用sed
命令。或者您可以保存s///部分并使用sed-f
调用该文件。非常感谢!这样做很有效,我很乐意避免使用额外的文件,但是很好。您可以将原始sed
中的两个\n
替换为=
,然后在sed
之后通过子进程调用tr“=”“\n”filename
。我不确定这会有多好,我也不知道子流程的语法,但是如果你真的不想要那个额外的文件,你可以尝试一下。