使用awk/sed实现跨文件键值对查找替换的技术求助
解决占位符替换问题的正确方法
你之前找到的awk命令逻辑没匹配上你的键值对格式,所以没法正常工作,我来给你一个能直接解决问题的方案:
问题核心分析
你的需求很明确:
key.txt里是冒号分隔的键值对,多个键值对用空格或换行分隔- 目标脚本里的占位符是
%%键名%%格式,要替换成对应的值,同时保留占位符前后的单引号
之前的命令错误在于:它直接把key.txt的每行按空格拆分后,把$1(比如server_name:server1)当作键、$2当作值,完全没解析冒号分隔的结构,自然找不到匹配的占位符。
正确的awk命令
直接用这个单行命令就能完成替换:
awk 'NR==FNR { # 处理key.txt:拆分所有键值对存入关联数组 num_pairs = split($0, pairs, /[ \n]/) for (i=1; i<=num_pairs; i++) { if (split(pairs[i], kv, /:/) == 2) { map["%%" kv[1] "%%"] = kv[2] } } next } { # 处理目标脚本:全局替换所有匹配的占位符 for (placeholder in map) { gsub(placeholder, map[placeholder]) } print }' key.txt 你的脚本文件名.txt
命令拆解说明
处理key.txt阶段:
NR==FNR:只在读取第一个文件(key.txt)时执行这段逻辑split($0, pairs, /[ \n]/):把当前内容按空格或换行拆分,得到所有单独的key:value字符串- 遍历每个
key:value,用冒号拆分出键和值,然后把%%键名%%作为数组键、对应值作为数组值存入map
处理目标脚本阶段:
- 对脚本的每一行,遍历
map里的所有占位符,用gsub完成全局替换 - 最后打印替换后的完整行
- 对脚本的每一行,遍历
效果验证
用你的示例测试:
key.txt内容:server_name:server1 username:someuser keyname:123key- 原脚本片段:
what is the servername '%%server_name%%' Enter your username '%%username%%' What is the ssh key value '%%keyname%%' - 替换后输出:
what is the servername 'server1' Enter your username 'someuser' What is the ssh key value '123key'
完全符合你的预期!
另外从你提供的xxd输出看,实际key.txt是每行一个键值对(比如sql_server_name:test_seqserver_1234),这个命令也能完美适配,因为拆分逻辑会自动处理换行分隔的情况。
内容的提问来源于stack exchange,提问作者dino110
相关产品推荐
相关产品推荐

