subprocess使用sed命令将变量输入到unix文件中的特定行

时间:2016-02-12 16:25:38

标签: python sed subprocess

我是一个完整的Python新手,但我需要创建一个小脚本作为更大项目的一部分。

我试图使用一个小的Python脚本将变量输入到Unix文件中的一行代码中。我一直试图使用subprocess.call(),这使我能够执行我需要赢得的命令,并允许我放入变量。

我一直在尝试以下方法:

import subprocess
var="some_variable"
subprocess.call(['sudo', 'sed', '-i', '-e' 's/line_to_replace.*/replacement_line' + var, /path/to/file.conf])

2 个答案:

答案 0 :(得分:1)

这里最明显的失败是你的代码没有在替换值的末尾放置一个尾随/以使其成为有效的sed命令:

import subprocess
var="some_variable".replace('/', r'\/') # backslash-escape any sigil instances
subprocess.call(['sudo', 'sed', '-i',
                 '-e', 's/line_to_replace.*/replacement_line%s/' % (var,),
                 '/path/to/file.conf'])

那就是说,请注意,这不适用于POSIX-standard sed(没有-i)或BSD sed(sed -i的扩展参数不是可选的)。用于就地编辑文件的POSIX标准工具是edex;考虑学习它们。

答案 1 :(得分:0)

您的直接问题是sed语法错误:您在替换字符串结束后缺少结束分隔符(并且需要引用文件名)。但是,大多数简单的Unix工具都可以很容易地用纯Python代替,通常可以在优雅和高效方面立即获得(避免外部流程通常会显着提高性能)。

import fileinput

for line in fileinput('/path/to/file', inline=True):
    if line.startswith('line_to_replace'):
       line = var + '\n'
    print line

如果您真的需要正则表达式支持,那么更改应该是显而易见的。 sudo更难以取代;如果获得对要操作的文件的写权限,则可以使用sudo从提示符中简单地运行此命令。否则,这不是一件容易的事。