首页 > 解决方案 > 如何使用 shell 脚本更改文件中标签之间的特定内容?

问题描述

我有一个虚拟主机 apache 配置文件,我想<VirtualHost *:80></VirtualHost>使用 shell 脚本更改标签内的所有内容。

我在 virtualhost.conf 中有这个:

<VirtualHost *:80>
    ServerName mysite.foo.bar

    DocumentRoot /var/www/html/src/

    <Directory /var/www/html/src/>
        Require all granted
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php?m=$1 [QSA]
        DirectoryIndex index.php
    </Directory>
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName mysite.foo.bar

        DocumentRoot /var/www/html/src/

        <Directory /var/www/html/src/>
            Require all granted
            RewriteEngine on
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)$ index.php?m=$1 [QSA]
            DirectoryIndex index.php
        </Directory>

        SSLCertificateFile /etc/foo/bar/fullchain.pem
        SSLCertificateKeyFile /etc/foo/bar/privkey.pem
        Include /etc/foo/options-ssl-apache.conf
    </VirtualHost>
</IfModule>    

而且,使用 shell 脚本,我想为此进行更改:

<VirtualHost *:80>
    ServerName mysite.foo.bar
    Redirect permanent / https://mysite.foo.bar/
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName mysite.foo.bar

        DocumentRoot /var/www/html/src/

        <Directory /var/www/html/src/>
            Require all granted
            RewriteEngine on
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)$ index.php?m=$1 [QSA]
            DirectoryIndex index.php
        </Directory>
        
        SSLCertificateFile /etc/foo/bar/fullchain.pem
        SSLCertificateKeyFile /etc/foo/bar/privkey.pem
        Include /etc/foo/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

换句话说,我想将端口 80 上的所有流量重定向到端口 443,但我需要在我的进程中自动执行此更改。

标签: linuxbashshellsedsh

解决方案


使用 GNU sed

sed -E '
/^\s*<VirtualHost\s.*:80>\s*$/,/^\s*<\/VirtualHost>\s*$/{
    /^\s*<\/?VirtualHost.*>\s*$/b
    /^\s*ServerName\s+(\S+).*/!d
    s%%&\n    Redirect permanent / https://\1/%
}' virtualhost.conf

推荐阅读