【问题标题】:How to replace multiple lines in file in Python using sed如何使用 sed 在 Python 中替换文件中的多行
【发布时间】:2018-01-18 01:44:16
【问题描述】:

我正在尝试快速替换以多行字符串“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

感谢任何建议!

【问题讨论】:

  • 如果你打算使用python 为什么不直接使用re 模块?
  • 您正在使用 Python。不是sed。使用 Python (re) 完成您的任务:它会更优雅,更便携(而且可能更快)。
  • 如果您对re 感到不舒服或无法理解,只需打开python 中的文件并逐行阅读即可。
  • 您说“我正在尝试使用 os.system 执行此操作”。为什么,确切地说,您要尝试使用os.system 来做到这一点?你会对纯 python 的答案感到满意吗?

标签: python sed replace


【解决方案1】:

直截了当的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)

【讨论】:

    【解决方案2】:

    您必须创建一个原始字符串以防止 python 在将输入字符串传递给操作系统调用之前对其进行解析。

    下面的例子说明了这一点

    你的输入字符串是

    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
    >>> 
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2011-02-19
      • 2013-04-21
      • 2022-11-14
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多