Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python脚本中在SED替换的中间添加换行符_Python_Regex_Python 3.x_Sed - Fatal编程技术网

在Python脚本中在SED替换的中间添加换行符

在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

我正在探索将一个大型项目从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. 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
。我不确定这会有多好,我也不知道
子流程的语法,但是如果你真的不想要那个额外的文件,你可以尝试一下。