SED 模式匹配
Posted
技术标签:
【中文标题】SED 模式匹配【英文标题】:SED pattern matching 【发布时间】:2022-01-12 20:04:21 【问题描述】:我正在尝试使用 sed 修改 nginx 配置文件。我想替换 ssl_certificate 和 ssl_certificate_key 的值
config="/etc/nginx/httpd.conf"
certfile="server.pem"
keyfile="key.pem"
sed -i -e "s/\(ssl_certificate *\/etc\/pki\/nginx\/\).*/\1$certfile/" $config
sed -i -e "s/\(ssl_certificate_key *\/etc\/pki\/nginx\/private\/\).*/\1$keyfile/" $config
我要修改的起始行看起来像这样
ssl_certificate /etc/pki/nginx/selfsigned.crt;
ssl_certificate_key /etc/pki/nginx/private/selfsigned.key;
ssl_dhparam /etc/pki/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
我结束了
ssl_certificate /etc/pki/nginx/server.pem
ssl_certificate_key /etc/pki/nginx/server.pem
ssl_dhparam /etc/pki/nginx/server.pem
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
我想要实现的是将 selfsigned.crt 替换为 server.pem 和 selfsigned.key 替换为 key。 pem 实现
ssl_certificate /etc/pki/nginx/server.pem
ssl_certificate_key /etc/pki/nginx/key.pem
ssl_dhparam /etc/pki/nginx/dhparam.pem
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
请指教。 TIA
【问题讨论】:
你最终得到了不同的 ssl_certificate 和 ssl_certificate_key 值,所以看起来你已经实现了你的目标。 变量$ssl_certificate
的值是多少?我怀疑您需要省略 $
并使用文字字符串 ssl_certificate
。
我刚刚意识到我打错了——不是 $ssl_certificate 而是 ssl_certificate。模式中没有变量,只有裸文本。
【参考方案1】:
使用sed
$ sed "/certificate/s|\(.*/\).*\(.$\)|\1$certfile\2|" input_file
ssl_certificate /etc/pki/nginx/server.pem;
ssl_certificate_key /etc/pki/nginx/private/server.pem;
ssl_dhparam /etc/pki/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
将行与certificate
匹配并在这些行上执行替换。
【讨论】:
【参考方案2】:我明白了:
cat /etc/nginx/httpd.conf | sed -e "s/\(ssl_certificate *\/etc\/pki\/nginx\/\).*/\1$certfile/" -e "s/\(ssl_certificate_key *\/etc\/pki\/nginx\/private\/\).*/\1$keyfile/"
server
listen 443 default_server ssl;
server_name _;
root /usr/share/nginx/html;
ssl_certificate /etc/pki/nginx/server.pem
ssl_certificate_key /etc/pki/nginx/private/key.pem
ssl_dhparam /etc/pki/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
【讨论】:
以上是关于SED 模式匹配的主要内容,如果未能解决你的问题,请参考以下文章