如何使用sed在Python中替换文件中的多行

时间:2017-08-10 01:29:59

标签: python sed replace

我试图快速替换以字符串' 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

感谢任何建议!

2 个答案:

答案 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)