我有shell文件test.sh,其中包含以下数据: -
export HOME = / some / path / to / directory
export VERSION = 89
export CONNECTION = database_connection
现在我想使用python更新shell脚本文件中的值HOME,VERSION和CONNECTION。 我怎么能在python中做到这一点?
答案 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想要覆盖键的值,只需将原始值写回文件。