0

我使用以下 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

4

3 回答 3

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))
于 2012-06-19T18:00:45.167 回答
1

我不知道这是否是唯一的错误,但您可能希望在路径名之前有一个空格,以将其与命令分开:

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

(我切换到字符串格式化操作符以使sed命令行的整体结构更易于查看)。

于 2012-06-19T17:57:50.620 回答
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])
于 2012-06-19T17:51:08.663 回答