我试图用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"