我试图快速替换以字符串' NATOMS'开头的文件(标题文件名)中的整行。有多条线。我试图使用os.system做到这一点,但没有发生任何事情。如果我将此字符串复制到命令行,它可以工作。这是代码:
import os
os.system("sed -i -e '/NATOMS/c\NATOMS 5 -1.10\n hi\nbye' filename")
我收到的错误(Python 2.7)是:
sed: -e expression #1, char 34: extra characters after command
我想在文件名中替换整行(数字从文件更改为文件):
NATOMS 6 -1.10
与
NATOMS 5 -1.10
hi
bye
感谢任何建议!
答案 0 :(得分:1)
你必须创建一个原始字符串,以防止python在调用OS调用之前解析输入字符串。
下面的例子说明了这个
您的输入字符串是
sed -i -e '/NATOMS/c\NATOMS 5 -1.10\n hi\nbye' sedinp.txt
现在将其分配给变量并打印
>>> normalcmd="sed -i -e '/NATOMS/c\NATOMS 5 -1.10\n hi\nbye' sedinp.txt"
>>> print normalcmd
sed -i -e '/NATOMS/c\NATOMS 5 -1.10
hi
bye' sedinp.txt
>>>
如您所见,转义序列已被解析。
现在创建一个原始字符串。
>>> rawcmd=r"sed -i -e '/NATOMS/c\NATOMS 5 -1.10\n hi\nbye' sedinp.txt"
>>> print rawcmd
sed -i -e '/NATOMS/c\NATOMS 5 -1.10\n hi\nbye' sedinp.txt
>>>
您可以看到未解析转义序列。
现在在os调用中使用它。
>>> os.system(rawcmd)
0
>>>
希望这有帮助。
答案 1 :(得分:0)
直接 Python 方式:
with open('yourfilename', 'r+') as f:
repl_str = 'NATOMS 5 -1.10\n hi\nbye'
lines = f.readlines()
f.seek(0)
f.truncate()
for l in lines:
f.write(repl_str if l.startswith('NATOMS') else l)