linux - 如何使用 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,但我需要在我的进程中自动执行此更改。
解决方案
使用 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
推荐阅读
- python - 模拟函数/对象,并根据输入/条件返回值
- python - 如何覆盖csv文件中的一行,或删除它
- r - 使用 mgcv gam 运行随机错误模型需要太多内存
- discord.py - discord.py 赋予某个用户 id 角色
- jquery - 使用 jQuery 的 WooCommerce 属性验证
- mongodb - 隐藏节点上的 MongoDB Oplogs
- sql-server - 同一服务器上不同数据库中两个表的唯一 ID
- python - Python格式化逗号分隔的文本字符串以保存为csv文件
- airflow - CLI 中的 Airflow Subdag 任务回填正在创建新任务,而不是重新运行失败的任务,并且仅运行 1 天而不是范围
- wso2 - WSO2,XML 到 JSON,强制将单个元素视为数组