替换python中的文件中的多个值

时间:2014-06-12 06:33:25

标签: python shell

我有shell文件test.sh,其中包含以下数据: -

export HOME = / some / path / to / directory

export VERSION = 89

export CONNECTION = database_connection

现在我想使用python更新shell脚本文件中的值HOME,VERSION和CONNECTION。 我怎么能在python中做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以通过简单的搜索和替换

来实现这一目标

re.M用于多行

import re

s = open('test.sh', 'r').read()

s = re.sub(r"^export HOME=.*$", "export HOME=/new/path", s, 0, re.M)
s = re.sub(r"^export VERSION=.*$", "export VERSION=new_version", s, 0, re.M)
s = re.sub(r"^export CONNECTION=.*$", "export CONNECTION=new_connection", s, 0, re.M)

open('test.sh', 'w').write(s)

答案 1 :(得分:0)

您可以读取该文件,然后解析出令牌。保留包含替换的字典,然后将该行写回 new 文件。

import re
exp = r'export (\w+)=(.*?)'

lookup = {'HOME': '/new/value', 'VERSION': 55}

with open('somefile.sh', 'r') as f, open('new.sh', 'w') as o:
    for line in f:
       if len(line.strip()):
          if not line.startswith('#'):  # This will skip comments
              tokens = re.findall(exp, line.strip())
              for match in tokens:
                  key, value = match
                  o.write('export {}={}\n'.format(key, lookup.get(key, value)))
              else:
                  # no lines matched, write the original line back
                  o.write(line)
           else:
              o.write(line) # write out the comments back

我将解释重要的部分,其余的只是常见的文件写入循环。

正则表达式将生成一个元组列表,每个元组都有匹配的键和值:

>>> re.findall(r'export (\w+)=(.*)', i)
[('HOME', '/some/path/to/directory'),
 ('VERSION', '89'),
 ('CONNECTION', 'database_connection')]

词典的get()方法将获取一个键,如果它不存在,则返回默认值None,但您可以覆盖要返回的默认值。利用这个我们有这条线:

o.write('export {}={}\n'.format(key, lookup.get(key, value)))

这就是说"如果密钥存在于查找字典中,则返回该值,否则返回文件中的原始值" ,换句话说,如果我们没有&#39 ; t想要覆盖键的值,只需将原始值写回文件。