0

我必须为这个脚本使用 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'])

[更新]

这是固定代码:

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

最后,我遗漏了一些斜线,需要将其中一个斜线加倍。没有社区就无法弄清楚。

4

2 回答 2

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

看起来绝对令人毛骨悚然。

第一件事:你为什么/在文件名参数上转义 s ?这仅在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\//'
                                  ^                          ^

在标记的地方加上/s 。^

编辑:我改变了"立场,以反映我的误解。请参阅下面的评论。

于 2013-11-14T16:10:29.510 回答
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 模块。

于 2014-03-14T10:53:59.700 回答