subprocess.call中的sed unterminated`s'命令

时间:2013-11-14 15:36:56

标签: python scripting sed subprocess

我必须为此脚本使用python的subprocess.call模块。我需要在文件中查找以下字符串:

"absolute/path/to/your/lib"

并将其替换为以下内容:

/var/www/twiki/lib

我的脚本在下面,但是当我运行它时,我得到了输出:

sed: -e expression #1, char 59: unterminated `s' command

这是使用python的subprocess.call模块的命令:

subprocess.call(['sed', '-e', 's/\"absolute\/path\/to\/your\/lib\/\"\/var\/www\/twiki\/lib\/', '\/var\/www\/twiki\/lib\/LocalLib.cfg'])

[UPDATE]

这是固定代码:

subprocess.call(['sed', '-e', 's/\"\/absolute\/path\/to\/your\/lib\"/\/var\/www\/twiki\/lib\//', '/var/www/twiki/bin/LocalLib.cfg'])

最后,我错过了一些斜线,需要双击其中一条。没有社区就无法想象出来。

2 个答案:

答案 0 :(得分:2)

subprocess.call(['sed', '-e', 's/\"absolute\/path\/to\/your\/lib\/\"\/var\/www\/twiki\/lib\/', '\/var\/www\/twiki\/lib\/LocalLib.cfg'])

看起来非常令人毛骨悚然。

第一件事:你为什么要逃避文件名参数的/?这只在s命令中是必需的。

第二件事:如果我将您的分隔符从/替换为#,我可以省略所有不必要的转义。

我做了两个然后得到了

subprocess.call(['sed', '-e', 's#"absolute/path/to/your/lib/"/var/www/twiki/lib/', '/var/www/twiki/lib/LocalLib.cfg'])

我看到了什么?命令中没有#(即没有未转义的/)。

尝试

's#"absolute/path/to/your/lib/"#/var/www/twiki/lib/#'

此处,或者如果您坚持使用/,请执行

's/"absolute\/path\/to\/your\/lib\/"/\/var\/www\/twiki\/lib\//'
                                  ^                          ^

/标记的地点添加了^个。

编辑:我更改了"职位,以反映我对误解的清除。请参阅以下评论。

答案 1 :(得分:1)

您可以做的另一件事是使用原始字符串表示法,注意" r"在下面的例子中的字符串之前。

import subprocess

COMMAND = r"""
    mysql -u root -h localhost -p --exec='use test; select 1, 2, 3 | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > sample.csv
"""

proc = subprocess.Popen(COMMAND, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
std_out, std_err = proc.communicate()

虽然这有效,但我之所以这样做只是因为bash中有大量这些命令我想用python包装它。我更喜欢直接从python使用mysql并使用csv模块。