这是一个让我在过去两个小时内烦恼的问题。 我有一个包含多行的模板文件,在某些行中,某些单词必须由其他一些单词更改。以下是我的模板的样子:
subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK }} {}
subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK }}
{
option domain-name-servers {{ MY_DOMAIN_IP }};
option domain-name {{ MY_DOMAIN_NAME }};
option routers {{ MY_GATEWAY }};
option broadcast-address {{ MY_BROADCAST }};
以下是我正在使用的代码:
f = open(DHCPD_PATH, 'w')
g = open(TEMPLATE_PATH, 'r')
patterns = {
'{{ MAC_ADDRESS }}' : mac,
'{{ IP_ADDRESS }}' : ip,
'{{ MY_IP }}' : MY_IP,
'{{ MY_DOMAIN_IP }}' : MY_DOMAIN_IP,
'{{ MY_DOMAIN_NAME }}' : MY_DOMAIN_NAME,
'{{ MY_NETMASK }}' : MY_NETMASK,
'{{ MY_GATEWAY }}' : MY_GATEWAY,
'{{ MY_SUBNET }}' : MY_SUBNET,
'{{ MY_BROADCAST }}' : MY_BROADCAST,
}
content = g.read()
for i,j in patterns.iteritems():
content = content.replace(i,j)
f.write(content)
f.close()
g.close()
这是我得到的文件:
subnet 192.168.10.0 netmask {{ MY_NETMASK }} {}
subnet 192.168.10.0 netmask 255.255.255.0
{
option domain-name-servers 192.168.10.10;
option domain-name "localnet.lan";
option routers 192.168.10.1;
option broadcast-address 192.168.10.255;
default-lease-time 600;
max-lease-time 7200;
filename "pxelinux.0";
next-server 192.168.10.3;
我无法理解为什么这个{{MY_NETMASK}}仍然存在,而其中一个已被正确替换,其他模板模式也被正确替换。
任何人都可以给我一个暗示吗?或者至少解释一下如何纠正它?
非常感谢
答案 0 :(得分:8)
@eumiro猜对了:你的一个空间不是空格。
>>> repr('subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK }} {}')
"'subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK\\xc2\\xa0}} {}'"
^^^^^^^^^^
看起来像一个不间断的空间。
答案 1 :(得分:3)
非常感谢 SO !!
为了提供更完整的答案(虽然你的答案非常明确,可以解决我的问题)我想提供一个可以免除我痛苦的vim配置:
为空格和表格提供不同的颜色:
:set syntax=whitespace
如果在打开文件后使用:list命令(:list!返回普通视图),〜/ .vimrc配置文件中的这一行会打印大部分不可见的字符:
set listchars=nbsp:¤,tab:>-,trail:¤,extends:>,precedes:<,eol:¶,trail:·
再次感谢
答案 2 :(得分:2)
除了&#39; iffy&#39;其他人指出的人物......
它可能有点过分但是 - 我很想安装jinja2 templating library,给它TEMPLATE_PATH
(作为字符串,或作为环境的一部分或(文件),然后使用您的.render
发出PATTERNS
,这将成为:
PATTERNS = {
'MAC_ADDRESS': '121422242424',
# etc...
}
替换也将一次完成,而不是迭代搜索/替换。您还可以在模板中输入合理的默认值,即:option something {{ MY_IP|default('127.0.0.1') }}