2012-03-14 121 views
1

添加一個新的指令,對於希望像這樣的模式:的Perl:在Apache虛擬主機文件

<VirtualHost 127.0.0.1:81> 
    Directive1 
    Directive2 
</VirtualHost> 

我想</VirtualHost>前插入新行字符串Directive3。請注意,它們可以是文件中的幾個<VirtualHost/>聲明,但它們都具有唯一的IP:PORT對。這是我到目前爲止有:

perl -p -i -e 's/(<VirtualHost 127\.0\.1\.1:81>[^(<\/VirtualHost>)+])(<\/VirtualHost>)/$1\n\tDirective3\n$2/ims' $file 

哪個細分得出:

  • <VirtualHost 127.0.0.1:81>
  • 其次是
  • 具有除</VirtualHost>
  • 一切其次是
  • </VirtualHost>

但這並不符合任何要求:(...

任何idead?

+0

'[^(<\ /虛擬主機>)+]'並不意味着'擁有一切,除了' – Toto 2012-03-14 10:10:50

+0

應該加號是後右括號]? – francoisrv 2012-03-14 10:12:40

+0

改爲使用'。+?'。 – Toto 2012-03-14 10:19:35

回答

1

perl -p當時讀取文件一行。您可以使用-0777使其讀取整個文件。

或者你可以使用類似:

perl -pE '(/<VirtualHost +127\.0\.0\.1:81>/ .. /<\/VirtualHost>/) =~ /E/ and say "\tDirective3"' 
+0

有趣!但仍然不能正常工作:( – francoisrv 2012-03-14 10:09:31

+0

+1爲觸發器運算符。 – Toto 2012-03-14 10:27:39

+0

它的工作原理!!!我正在學習Perl,我知道它有壞按其複雜的語法,但我發現它相當真棒迄今:)謝謝@Qtax – francoisrv 2012-03-14 10:32:30