对于这个脚本,我必须使用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'])最后,我漏掉了几个斜线,需要把其中一个砍成两倍。没有社区就搞不出来了。
发布于 2013-11-14 16:10:29
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\//'
^ ^将/添加到^标记的位置。
编辑:我改变了"的立场,以反映我的误解的清除。见下面的评论。
发布于 2014-03-14 10:53:59
您可以做的另一件事是使用原始字符串表示法,注意下面示例中字符串前面的"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和csv模块使用mysql。
https://stackoverflow.com/questions/19981840
复制相似问题