搜索&用sed

时间:2018-05-04 21:26:39

标签: 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这样的单行值,则可行。但是多线无效。

我如何使这项工作?

1 个答案:

答案 0 :(得分:0)

尝试一下:

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