SED:从httpd-vhosts.conf中删除虚拟主机



我试图用SED删除httpd-vhosts.conf的虚拟主机项目,并使用正确的匹配正则拨号。

我想删除这样的块:

<VirtualHost *:80>
    ServerName local.testsite.org
    DocumentRoot "/home/sites/local.testsite.org/www"
    ErrorLog "/home/sites/local.testsite.org/logs/error_log"
    CustomLog "/home/sites/local.testsite.org/logs/access_log" common
    <Directory "/home/sites/local.testsite.org/www">
        AllowOverride All
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>

我的正则是匹配它(https://regex101.com/r/owis8w/3):

/<VirtualHost *:80>ntServerName local.duudaduu.com(.|n)*</VirtualHost>/

我如何将此表达式与sed一起使用,我不知道如何与SED一起使用...

sed '/<VirtualHost *:80>ntServerName local.testsite.org(.|n)*</VirtualHost>/' /usr/local/etc/httpd/extra/httpd-vhosts.conf

我最终通过一种更简单的方法来使用每个主机使用单独的.conf文件来创建和删除Apache上的VirtualHosts。这样,我可以创建或删除文件,而不是在文件中搜索多行字符串。

我想为我的Mac上的Apache中的每个虚拟Host加载一个单独的.conf文件(Apache等与Homebrew一起安装)。

这很容易在我的httpd.conf中设置。而不是寻找文件,只需查找使用etc/httpd/vhosts/*.conf的目录中的所有文件:

# Virtual hosts
# Include /usr/local/etc/httpd/extra/httpd-vhosts.conf  # Original rule
Include /usr/local/etc/httpd/vhosts/*.conf              # New rule

这是该文件夹中的所有.conf文件。我的文件名就像:local.website.com.conf,包含类似的内容:

<VirtualHost *:80>
    ServerName local.website.com
    DocumentRoot "/Users/john/Sites/local.website.com/www"
    <Directory "/Users/john/Sites/local.website.com/www">
        AllowOverride All
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>

使用这种方法,您可以简单地删除.conf文件,重新启动Apache,然后完成!

这是此问题的第一个搜索结果之一,以防其他任何人都想从带有多个此类条目的.conf文件中删除virtualHost由尤尔根(Jurgen)描述,然后这个主题的答案对我有所帮助。

而不是sed,您可以这样使用awk

$ VHOSTS_PATH="/usr/local/etc/httpd/extra/httpd-vhosts.conf"
$ SERVER_NAME="local.testsite.org"
$ awk -vs='\<ServerName[[:space:]]+'"$SERVER_NAME"'\>' '
    /^[[:space:]]*<VirtualHost/,/^[[:space:]]*</VirtualHost>/ {
      tmp = tmp $0 "n"}
    /^[[:space:]]*</VirtualHost>/ && tmp {
      if(tmp !~ s) printf("%s", tmp); tmp = ""; next}
    !tmp {print}' "$VHOSTS_PATH"

最新更新