我使用以下sed命令查找并用新的字符串替换旧字符串:
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命令有什么问题吗? 或者我给出文件名的方式有什么不对吗?
更新: 该命令的回声: sed -i's / 6.9.28 /6.9.29/'dirname / filename
答案 0 :(得分: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))
编辑:
纳入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 :(得分:1)
我不知道这是否是唯一的错误,但你可能想要在路径名前面留一个空格,将它与命令分开:
cmd = "sed -i 's/%s/%s/' %s"%(oldstr, newstr, "path_to/filename")
(我切换到字符串格式化运算符,以便更容易看到sed
命令行的整体结构。)
答案 2 :(得分: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])