如何使用awk将文件中的指定内容替换为唯一值?
解决AWK替换
{{RANDOM}}时的输出混乱问题 你的脚本之所以会出现随机串被乱序追加、原内容格式混乱的情况,核心问题是awk的system()函数并不会返回命令的输出结果——它只会执行命令并将输出直接打印到标准输出,同时返回命令的退出状态码(通常成功时是0)。所以你的gsub实际上是把{{RANDOM}}替换成了0,而random函数的输出被直接输出到终端,和原文件内容混在了一起。
另外你的random函数也有冗余:openssl rand -base64 15已经直接输出Base64编码的随机串,不需要再通过printf管道给openssl base64做二次编码,这会导致随机串长度翻倍且重复编码。
修复方案一:改进AWK脚本,捕获命令输出
我们可以用awk的getline来捕获random函数的输出,再完成替换:
# 简化random函数,直接生成15字节的Base64随机串 random() { openssl rand -base64 15; } export -f random # 改进后的awk脚本 awk ' /{{RANDOM}}/ { # 调用bash执行random函数,捕获输出到rand变量 if ("bash -c random" | getline rand) { gsub(/{{RANDOM}}/, rand) } # 关闭管道避免资源泄漏,确保每次调用都生成新的随机数 close("bash -c random") } # 打印处理后的行 1' test.txt
修复方案二:纯Bash处理,避免AWK的坑
如果不想用awk,也可以用纯Bash逐行处理文件,逻辑更直观:
random() { openssl rand -base64 15; } # 逐行读取文件,保留原始换行和空格 while IFS= read -r line; do # 循环替换当前行中的所有{{RANDOM}}(每行可能有多个) while [[ "$line" == *'{{RANDOM}}'* ]]; do rand=$(random) line=${line//'{{RANDOM}}'/"$rand"} done echo "$line" done < test.txt
测试输出示例
运行上述任意脚本后,你的test.txt内容会被正确替换,比如:
apiVersion: v1 data: app_username: something app_password: 7ZkK7x8QZ9eR0tY1uI2oP3aS4dF5gH6jK8l another_app_username: something another_app_password: 9mN0bV1cX2zA3sD4fG5hJ6kL7pO8qR9t
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

