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.pemselfsigned.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 模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用 sed 或 awk 按照匹配模式打印一行

三剑客之sed

如果一行匹配条件,则 sed 替换与模式范围匹配的行

使用 sed 删除匹配模式不适用于 mac os Catalina

Sed - 在两个字符串之间的匹配模式后插入带文本的行

使用 sed 在第 N 个匹配模式之后插入一些文本