linux - 使用 sed 搜索并替换配置文件值

标签 linux bash sed

我正在努力在我的网络应用程序中自动更新和安装证书。这个特别的是 qBittorrent。它将 SSL 证书/私钥存储在配置文件中,如下所示

...
WebUI\AuthSubnetWhitelistEnabled=false
WebUI\HTTPS\Certificate=@ByteArray(-----BEGIN CERTIFICATE-----\n0GCSqGSIb3DQEBCwUA\nMEoxCzAQaih7W\n-----END CERTIFICATE-----)
WebUI\HTTPS\Enabled=true
WebUI\HTTPS\Key="@ByteArray(-----BEGIN PRIVATE KEY-----\nFAASdoONpV\nBvX+hUcjAne0PkZV9d7NG1QvipW+MPa4N12i+aRmwK\nhACATS21MMnBFTRGSfzwLy4=\n-----END PRIVATE KEY-----)"
WebUI\LocalHostAuth=true
...

我需要能够解析文件并替换证书和私钥字符串。在这上面花了几天时间之后,我接近了

sed -i -E "s/(WebUI\\\\HTTPS\\\\Certificate=@ByteArray\().+(\))/\1foo\2/g" /home/qbtuser/.config/qBittorrent/qBittorrent.conf

这有效并将证书字符串替换为 foo。但是,当我从文件中读取实际证书并替换它时,它失败了:

cert=$(<$certPath)
sed -i -E "s/(WebUI\\\\HTTPS\\\\Certificate=@ByteArray\().+(\))/\1${cert}\2/g" /home/qbtuser/.config/qBittorrent/qBittorrent.conf
sed: -e expression #1, char 78: unterminated `s' command

显然它不喜欢证书文件中的换行符。如果我将 cert 设置为像 foo 这样的单行值,它就可以工作。但是多行不起作用。

我如何使它工作?

最佳答案

试试这个:

certificate=$(sed ':a;N;$!ba;s/\n//g' certificateFile);
sed -i -E "s/(WebUI\\\\HTTPS\\\\Certificate=@ByteArray\().+(\))/\1$certificate\2/g" targetFile

关于linux - 使用 sed 搜索并替换配置文件值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50183251/

相关文章:

linux - 当我使用 GTX 590 在 Ubuntu 10.04 上运行 cuda 代码时,我得到 "Runtime API error : invalid device ordinal."

Bash 将值重新分配给变量 "command not found"

linux - 从文件 bash 中查找与给定值最接近的值

shell - 在 unix 中向文件中的任意位置添加一列 [使用 awk 或 sed]

c++ - g++ 4.6.1 编译器错误 : Error: unknown pseudo-op: `.cfi_personality'

我可以在主应用程序和多个线程中使用相同的套接字吗?

regex - 如何删除与模式匹配的特定数量的随机行

linux - 如何使用 Linux 命令(sed?)删除文件中的特定行?

linux - 用于打印具有分隔符的变量的 Shell 脚本

linux - BASH - 如何让它始终从系统启动和崩溃重启时运行?