在python脚本中的sed替换中间添加换行符

时间:2014-07-29 15:01:43

标签: python regex python-3.x sed

我正在探索从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

1 个答案:

答案 0 :(得分:0)

我在GNU / Linux终端中运行sed -ir 's:(#!/usr/bin/).*python.*:\1env python 3\n\n# Comment\n:'并且运行正常。如果在find . -name "*.py" -exec命令之前添加[sed],它应该递归遍历,找到所有python文件并应用替换。

很明显,Python在运行\nsed时遇到了麻烦所以我建议在实际的终端中运行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并替换您想要的部分