1

我正在尝试删除 apache 配置文件中的一段文本,特别是虚拟主机。我需要删除包含 < VirtualHost> 标记的虚拟主机容器。

Stuff

<VirtualHost   asdfalsdkf:*> 
asldkfjasl;dkfjasldkfj
asdfljasldjf;laksdfj
a;lsdkfj;laksjdfas
asldkfjasldfkj
3495034ijfgdl9)_*)(%$
more stuff
</VirtualHost>

stuff

到目前为止,我已经尝试对其进行正则表达式。但它不会更改文件。我实际上是在尝试更新文件并删除代码。

这是我到目前为止没有工作的。

for line in fileinput.input('/etc/apache2/apache2.conf.replace',inplace=True):
    sys.stdout.write(re.sub(r'<VirtualHost.*?>.*?</VirtualHost>','',line))
4

2 回答 2

5

这里有两个问题。第一个是(正如 javex 指出的那样)您需要使用re.DOTALL.

但这还不够。您仍然一次只输入一行正则表达式,因此它永远不会同时看到开始和结束VirtualHost标签。AFAIK,没有办法使用 获取文件的全部内容fileinput,但假设您不需要接受来自 STDIN 的输入,并且文件足够小,可以一次全部读入内存(Apache 配置文件应该是这种情况),这应该这样做:

import os
import sys
import re

for fn in sys.argv[1:]:
    os.rename(fn, fn + '.orig')
    with open(fn + '.orig', 'rb') as fin, open(fn, 'wb') as fout:
        data = fin.read()
        data = re.sub(r'<VirtualHost.*?>.*?</VirtualHost>', '', data,
                      flags=re.DOTALL)
        fout.write(data)

这需要 Python 2.7,因为我在语句中使用了嵌套上下文的内置语法with,但您可以使用 . 获得与早期版本相同的功能contextlib.nested

于 2012-08-22T13:35:42.443 回答
2

除非指定,否则点字符.将不匹配换行符:re.DOTALL

for line in fileinput.input('/etc/apache2/apache2.conf.replace',inplace=True):
    sys.stdout.write(re.sub(r'<VirtualHost.*?>.*?</VirtualHost>','',line, flags=re.DOTALL))

(参见 pythons re文档)

于 2012-08-22T13:18:28.643 回答