regex - 用不同的熵字节替换文件中出现的字符串
问题描述
在 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 或类似的解决方案。)
解决方案
而不是sed
,您可以使用grep
:
grep '<SECRET>' .env
来自man grep
:
退出状态
通常,如果选择了一行,则退出状态为 0,如果未选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。但是,如果使用 -q 或 --quiet 或 --silent 并选择了一行,即使发生错误,退出状态也是 0。
如果返回值为 0,则应用您的sed
命令来执行替换。
推荐阅读
- python - 试图通过python3将csv文件导入postgresql数据库
- c# - 如何仅使用 XAML 更改资源模板元素的属性?
- postgresql - 使用 postgresql 驱动程序静态编译 Qt 时出错
- memory-management - Apache Ignite 与 Redis (jemalloc) 的内存分配?
- swift - Swift 函数重载 - 在传递 Any 对象时使用特定参数(代替 Any 参数)调用 func
- c++ - 带有 initializer_list 和 size 的 std::unordered_map 构造函数在 main 中编译,但不在类定义中
- python - 从熊猫数据框中添加所有行
- mongodb - 如何在 MongDB:s 函数中使用 Insert
- json - 如何在 JSON 文件中格式化带有三引号的多行字符串?
- asp.net-mvc - 当有很多存储过程时,实体框架代码优先或数据库优先