2012-06-19 4 views
0

Я использовал следующую команду, чтобы патч в найти и заменить старую строку с новым:SED -unterminated `S'

cmd = "sed -i 's/"+oldstr+"/"+newstr+"/'"+ "path_to/filename" #change the string in the file 
    os.system(cmd) # am calling the sed command in my python script 

Но я получаю эту ошибку:

sed: -e expression #1, char 8: unterminated `s' command 
Может кто-то

скажите мне, что не так с моей командой sed? Или что-то не так в том, как я дал имя файла?

Update: эхо этой команды: SED -i 'S/6.9.28 /6.9.29/' имя_директории/имя_файла

+2

эхо, что 'cmd', показывают нам, что там ... – Wrikken

+1

выглядит как что-то в 'oldstr' или' newstr'. как заметил @Wrikken, эхо об ошибке, потому что у вас, похоже, есть галочка перед «s» --- вы обязаны использовать 'sed' для этой операции? – swasheck

+4

Использование 'sed' в скрипте python кажется довольно глупым и грязным взломом и нарушает переносимость. Если он предназначен для запуска только в Linux, тогда все в порядке. И 'os.system' тоже устарела, используйте модуль' subprocess'. – KurzedMetal

ответ

3

Без вызова sed

with open("path_to/filename") as f: 
    file_lines = f.readlines() 
    new_file = [line.replace(oldstr,newstr) for line in file_lines] 

open("path_to/filename","w").write(''.join(new_file)) 

EDIT:

Включение комментарий Joran в:

with open("path_to/filename") as f: 
    file = f.read() 
    newfile = file.replace(oldstr,newstr) 

open("path_to/filename","w").write(newfile) 

или даже

with open("path_to/filename") as f: 
    open("path_to/filename","w").write(f.read().replace(oldstr,newstr)) 
+1

не могли бы вы просто прочитать() вместо readlines и только сделать одну замену (так как она должна заменить все вхождения?) –

+0

@JoranBeasley Хорошая точка. Обновлено – swasheck

+0

Это работает (последний фрагмент кода не работает)! Спасибо .. – user1164061

0

Я не знаю, что происходит не так с вашей командой. Во всяком случае, вы, конечно, лучше поработаете с функцией 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]) 
+0

использовал это: 'import subprocess oldstr = 'и/или' newstr = 'AND' path = 'test.txt' sedcmd = 's /% s /% s /'% (oldstr.replace ('/ ',' \\/'), newstr.replace ('/',' \\/')) subprocess.call ([' sed ',' -i ', sedcmd, path]) 'и он все еще показывает такая же ошибка – user1164061

1

Я не знаю, если это единственное, что неправильно, но вы, вероятно, хотите пробел перед именем пути, чтобы отделить его от команды:

cmd = "sed -i 's/%s/%s/' %s"%(oldstr, newstr, "path_to/filename") 

(я перешел к оператору строки форматирования чтобы упростить общую структуру командной строки sed).

+0

Это также дает ту же ошибку – user1164061

Смежные вопросы