技术问询:文件选定内容插入指定模式后及IP替换主机列表方法
从file1提取[abc]段IP并替换file2主机列表的解决方案
我来帮你搞定这个需求,分两步走:先精准提取IP,再替换file2里的目标内容,顺便也给你讲通用的「插入内容到指定模式后方」的方法。
第一步:从file1的[abc]段提取IP地址
假设你的file1是类似这样的分段配置文件:
[other_section] 192.168.1.100 [abc] 10.0.0.1 10.0.0.2 10.0.0.3 [another_section] 172.16.0.5
我们可以用awk精准提取[abc]段下的合法IPv4地址(避免误抓其他无关内容):
awk '/^\[abc\]$/{flag=1; next} /^\[/{flag=0} flag && /^([0-9]{1,3}\.){3}[0-9]{1,3}$/' file1 > extracted_ips.txt
命令拆解:
/^\[abc\]$/{flag=1; next}:匹配到[abc]行时,开启提取标记flag=1,跳过当前行继续处理下一行/^\[/{flag=0}:遇到其他以[开头的分段行时,关闭提取标记flag && /^([0-9]{1,3}\.){3}[0-9]{1,3}$/:标记开启时,只输出符合IPv4格式的行,结果保存到extracted_ips.txt临时文件
第二步:替换file2中的主机列表
假设file2里的主机列表有明确的标记(方便精准替换),比如:
# 系统配置 port=8080 # 主机列表开始 old-host-1 old-host-2 # 主机列表结束 timeout=30
方法1:用sed快速替换标记间内容(保留首尾标记)
sed -i.bak -e '/# 主机列表开始/,/# 主机列表结束/{ /# 主机列表结束/{r extracted_ips.txt } /# 主机列表开始/!d }' file2
命令拆解:
-i.bak:修改file2的同时自动创建备份文件file2.bak,防止误操作/# 主机列表开始/,/# 主机列表结束/:匹配首尾标记之间的所有行/# 主机列表结束/{r extracted_ips.txt}:遇到结束标记时,读取extracted_ips.txt的内容插入到它前面/# 主机列表开始/!d:只保留开始标记行,自动删除中间的旧主机内容
方法2:用awk灵活处理复杂场景
如果file2的标记不固定,或者你需要更精细的控制,用awk更稳妥:
awk -v ip_list="$(cat extracted_ips.txt)" ' /# 主机列表开始/ { print $0 print ip_list skip = 1 next } /# 主机列表结束/ { skip = 0 } !skip { print $0 } ' file2 > temp_file && mv temp_file file2
命令拆解:
-v ip_list="$(cat extracted_ips.txt)":把提取的IP列表作为变量传入awk- 遇到开始标记时,先打印标记行,再打印IP列表,开启跳过标记
skip=1 - 遇到结束标记时,关闭跳过标记
- 只有当
skip=0时,才打印file2的原有行,自动跳过旧的主机列表内容
通用技巧:将内容插入到指定模式后方
如果只是单纯想把某段内容插入到file2中某个模式行的后面(比如在# 自定义主机行后面加IP),用sed一行就能搞定:
sed -i.bak '/# 自定义主机/r extracted_ips.txt' file2
这个命令会在所有匹配到# 自定义主机的行后面,插入extracted_ips.txt里的内容。
最后别忘了清理临时文件(如果不需要的话):
rm extracted_ips.txt
内容的提问来源于stack exchange,提问作者seyfs
相关产品推荐
相关产品推荐

