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

ここには 2 つの問題があります。1つ目は(javaxが指摘したように)使用する必要があることですre.DOTALL

しかし、それだけでは十分ではありません。一度に 1 行ずつしか正規表現をフィードしていないため、開始タグと終了タグの両方が表示されることはありませんVirtualHost。私の知る限り、 を使用してファイルの内容全体を取得する方法は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 に答える