2013-11-14 67 views
0

我必須使用Python的subprocess.call模塊爲這個腳本。我需要看的文件爲以下字符串:sed未終止`s'命令在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']) 

最後,我錯過了幾個斜線,需要對他們的雙斜線之一。如果沒有社區,就不可能想出來。

+0

'sed -e' no'-i' – Farhadix

+0

@Farahadix我將-i選項更改爲-e,但錯誤仍然相同。感謝您的快速反饋! – user2970338

+1

你需要一個/在你的s命令的終止之前。你也可以做????? –

回答

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\//' 
           ^      ^

與上^標記的地方加入/秒。

編輯:我改變了"職位,以反映我的誤解清除。請參閱下面的評論。

+0

'[''''=='''''in [Python string literal](http: call(['sed','-i','//');''sed''不需要引號''' '#/ new/path /「#/ new/path /#',filename])' – jfs

+0

@JFSebastian謝謝,改變了我的答案。 – glglgl

+0

引用應該在舊路徑 – jfs

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使用mysql並使用csv模塊。