首页 > 解决方案 > 用不同的熵字节替换文件中出现的字符串

问题描述

在 Linux 上,我需要以编程方式替换占位符字符串,例如<SECRET>在这样的.env文件中:

KEY=<SECRET>
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=<SECRET>

需要注意的是,这个占位符的每次出现都必须替换为 Base64 编码随机性的不同实例 - 例如来自 OpenSSL,因为它在许多 Linux 上很容易获得。

阅读这个答案sed,我用 GNU 4.8试过这个:

sed -i '0,/<SECRET>/ s__'$(openssl rand -base64 42)'_' .env

(在替换部分_选择了替代分隔符,因为 Base64 编码的字节可以包含/+字符,否则在无意中用作分隔符时会发生冲突。)


这适用于单个替换,一次调用一个。

但是 sed 的返回码总是0,即使所有出现的正则表达式都已被消耗和替换......

问题:当占位符用尽时,有没有办法让 sed 返回一个非零代码?

(如果这不能用 sed 完成,我很高兴使用 awk 或类似的解决方案。)

标签: regexlinuxstringawksed

解决方案


而不是sed,您可以使用grep

grep '<SECRET>' .env

来自man grep

退出状态

通常,如果选择了一行,则退出状态为 0,如果未选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。但是,如果使用 -q 或 --quiet 或 --silent 并选择了一行,即使发生错误,退出状态也是 0。

如果返回值为 0,则应用您的sed命令来执行替换。


推荐阅读