Я не знаю, что происходит не так с вашей командой. Во всяком случае, вы, конечно, лучше поработаете с функцией 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
Использование 'sed' в скрипте python кажется довольно глупым и грязным взломом и нарушает переносимость. Если он предназначен для запуска только в Linux, тогда все в порядке. И 'os.system' тоже устарела, используйте модуль' subprocess'. – KurzedMetal