1

我有一个快速而肮脏的构建脚本,需要更新一个小的 xml 配置文件中的几行。由于文件太小,我使用一个公认的低效过程来更新文件,以保持简单:

def update_xml(property, value):
  for line in fileinput.input(os.path.join(app_dir, 'my.xml'), inplace=True):
    if property is 'version':
      line = re.sub(r'(<version>).*?(</version>)', '\1%s\2' % value, line, flags=re.IGNORECASE)
    elif property is 'brand':
      line = re.sub(r'(<property name="brand" type="string">).*?(</property>)', '\1%s\2' % value, line, flags=re.IGNORECASE)
    elif property is 'env':
      line = re.sub(r'(<property name="env" type="string">).*?(</property>)', '\1%s\2' % value, line, flags=re.IGNORECASE)

    print line

我有两个问题:

  • 后面的引用没有捕捉到我的期望。<version>a.b.c</version>例如,我没有得到 ,而是得到由控制字符包围的版本值。我试过加倍反斜杠,删除格式化的打印和其他一些东西,但不能完全正确。
  • 当我将该行写回文件 ( print line) 时,我得到了几个额外的换行符。

我在这儿闹什么?

4

2 回答 2

0

换个试试"\1%s\2" by "\g<1>%s\g<2>",可能有问题。。

关于换行符,打印可能会在现有行的顶部添加第二个新行。

你可以试试:print line,用逗号来抑制新行字符

于 2013-03-12T14:20:02.080 回答
0

使用原始字符串来避免\1\2成为控制字符:r'\1%s\2'

于 2013-03-18T07:54:24.877 回答