我必须为此脚本使用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'])
最后,我错过了一些斜线,需要双击其中一条。没有社区就无法想象出来。
答案 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模块。