如何根据前置标记替换文本文件中IP:PORT格式的IP部分
问题需求
在文件中搜索指定标记字符串(如marker-a、marker-b),更新其后IP:PORT格式文本中的IP部分,保留端口(PORT)值不变。
示例场景
标记与目标IP映射
marker-a should use 600.0.0.100 marker-b should use 700.0.0.200
修改前的文件内容
server marker-a 100.0.0.10:11648 check server marker-b 100.0.0.11:11111 check server marker-a 100.0.0.10:11648 check server marker-b 100.0.0.11:11111 check
修改后的文件内容
server marker-a 600.0.0.100:11648 check server marker-b 700.0.0.200:11111 check server marker-a 600.0.0.100:11648 check server marker-b 700.0.0.200:11111 check
已尝试的无效sed命令及问题
sed -e '/^ *marker-a / s/ [^# ]/ 600.0.0.100/' input.txt
- 问题:匹配规则错误,原文件行以
server开头,/^ *marker-a /无法匹配到目标行;替换部分[^# ]仅匹配单个字符,无法覆盖整个IP段。
sed -e 's/^"marker-a" .*$/"marker-a 600.0.0.100"/' input.txt
- 问题:原文件中没有带双引号的
"marker-a",匹配规则完全不匹配目标内容。
可行解决方案
方案1:sed命令(单/多标记处理)
针对每个标记单独写替换规则,利用正则捕获端口部分:
单独处理marker-a:
sed -E '/marker-a/ s/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)/600.0.0.100:\2/' input.txt
单独处理marker-b:
sed -E '/marker-b/ s/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)/700.0.0.200:\2/' input.txt
合并为一条命令同时处理两个标记:
sed -E -e '/marker-a/ s/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)/600.0.0.100:\2/' \ -e '/marker-b/ s/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)/700.0.0.200:\2/' input.txt
- 说明:
-E启用扩展正则,让捕获组()无需转义/marker-a/过滤出包含该标记的行([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)捕获原IP部分:([0-9]+)捕获端口部分(存为\2)- 替换时用新IP加上保留的端口
\2
方案2:awk命令(多标记批量处理)
如果有大量标记需要处理,用映射表批量修改更灵活:
awk ' BEGIN { ip_map["marker-a"] = "600.0.0.100" ip_map["marker-b"] = "700.0.0.200" } { if ($2 in ip_map) { split($3, addr, ":") $3 = ip_map[$2] ":" addr[2] } print $0 } ' input.txt
- 说明:
- BEGIN块定义标记到目标IP的映射表
- 遍历每一行,判断第二个字段(标记)是否在映射表中
- 分割第三个字段(IP:PORT)为IP和端口,替换IP后重新组合
- 输出修改后的行
直接修改原文件
若需直接修改原文件(谨慎操作),GNU sed可加-i参数:
sed -i -E -e '/marker-a/ s/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)/600.0.0.100:\2/' \ -e '/marker-b/ s/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)/700.0.0.200:\2/' input.txt
内容的提问来源于stack exchange,提问作者stealthcoder
相关产品推荐
相关产品推荐

