【问题标题】:Replace occurrences of a string in file with different bytes of entropy each用不同的熵字节替换文件中出现的字符串
【发布时间】:2020-06-13 15:45:52
【问题描述】:

在 Linux 上,我需要在 .env 文件中以编程方式替换 <SECRET> 等占位符字符串,如下所示:

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

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

阅读 this answer,我用 GNU sed 4.8 试过这个:

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

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


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

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

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

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

【问题讨论】:

  • 这stackoverflow.com/q/15965073>能回答你的问题吗?
  • @Quasímodo 我已经尝试过了,但这也没有用 - 返回码仍然是 0。
  • 正如@Quasímodo 所建议的那样,在使用 sed 进行替换之前,我已经在一个 while 循环中对占位符进行了 grep'ing。

标签: regex linux string awk sed


【解决方案1】:

您可以使用grep,而不是sed

grep '<SECRET>' .env

来自man grep

退出状态

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

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

【讨论】:

  • 谢谢,这成功了:只需用 grep 将 sed 替换包装在 while 条件中:while grep -q '&lt;SECRET&gt;' test; do sed -i '0,/&lt;SECRET&gt;/ s__'$(openssl rand -base64 42)'_' test; done
【解决方案2】:
$ awk '
    BEGIN { cmd = "openssl rand -base64 42" }
    match($0,/<SECRET>/) {
        val = ( (cmd | getline line) > 0 ? line : "N/A" )
        $0 = substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
        close(cmd)
    }
1' file
KEY=hDc3Bw4J9+TUbbhw4cNKda+mDHVRGGrAWUU6LX7aYZnWwDZWyqrmzi3z
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=LzGaB43Mm5mF6tsJnwOLqgeeoTwajH9FNLty9yD22QovadhwWKpr7AP6

或者如果&lt;SECRET&gt; 可以在 1 行多次出现,则:

$ awk '
    BEGIN { cmd = "openssl rand -base64 42" }
    {
        while ( match($0,/<SECRET>/) ) {
            val = ( (cmd | getline line) > 0 ? line : "N/A" )
            $0 = substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
            close(cmd)
        }
    }
1' file
KEY=t3/bimGkyPQcjOL6ubV6QmRnPjrvtg4+HvvkuJSnuYCYc+BzOmAWKRV6
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=TKvDbMphOhmhL0/NSQEE2Gs9sFr3Cwt9o3CbOoe9FZPjAR/+m6i4QjcR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2015-07-31
    • 2011-07-08
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多