我不知道什麼是你的命令去錯了。無論如何,你肯定會使用subprocess.call()功能更好。假設我們有一個文件:
$ cat test.txt
abc
def
現在,如果我執行下面的程序:
import subprocess
oldstr = 'a'
newstr = 'AAA'
path = 'test.txt'
subprocess.call(['sed', '-i', 's/'+oldstr+'/'+newstr+'/', path])
我們得到這樣的:
$ cat test.txt
AAAbc
def
另外,如果您oldstr
/newstr
有一些斜線(/
)裏面,你的命令也會打破。我們可以通過一個轉義斜槓替換斜線解決它:
>>> print 'my/string'.replace('/', '\\/')
my\/string
所以,如果你有這樣的文件:
$ cat test.txt
this is a line and/or a test
this is also a line and/or a test
,並要替換and/or
,只是相應的更換斜線的變量:
import subprocess
oldstr = 'and/or'
newstr = 'AND'
path = 'test.txt'
subprocess.call(['sed', '-i', 's/'+oldstr.replace('/', '\\/')+'/'+newstr.replace('/', '\\/')+'/', path])
當然,它可以是多一點可讀:
import subprocess
oldstr = 'and/or'
newstr = 'AND'
path = 'test.txt'
sedcmd = 's/%s/%s/' % (oldstr.replace('/', '\\/'), newstr.replace('/', '\\/'))
subprocess.call(['sed', '-i', sedcmd, path])
呼應的是'cmd',告訴我們什麼是在那裏... – Wrikken
看起來像'oldstr'或'newstr'中的東西。正如@Wrikken所指出的那樣,由於你在「s」之前似乎有一個嘀嗒聲,所以你的迴應是錯誤的--- ---你是否必須使用'sed'來執行此操作? – swasheck
在python腳本中使用'sed'看起來非常愚蠢和骯髒的破解,並且會破壞可移植性。如果它打算只在Linux中運行,那麼沒關係。而'os.system'也不推薦使用'subprocess'模塊。 – KurzedMetal