【一周一Q】如何快速复制有规律内容

时间:2022-09-15 00:14:12

最近微信群里打算每周可以出个题目,丢给大家一起思考下问题的处理方式,不一定有标准的答案,不过总会有更合适答案的情况

题目如下

 1 快速复制额外的dns配置,这个是在处理双域名指向的时候遇到的一个需求,需要处理几百个记录的指向,如何快速并且正确的处理完成
 2 最原始配置文件内容
 3 address=/jenkins.f6car.org/10.29.128.247
 4 address=/kibana.f6yc.org/10.29.128.247
 5 address=/auto.f6car.org/192.168.13.103
 6 
 7 需要改成如下这样,即每条原始记录,增加一个org.cn后缀
 8 address=/jenkins.f6car.org/10.29.128.247
 9 address=/jenkins.f6car.org.cn/10.29.128.247
10 address=/kibana.f6yc.org/10.29.128.247
11 address=/kibana.f6yc.org.cn/10.29.128.247
12 address=/auto.f6car.org/192.168.13.103
13 address=/auto.f6car.org.cn/192.168.13.103

 

题目贴的只有三项dns记录,实际这类配置有接近100条,如果都一条条复制,估计一天不用干别的事情了,所以要想想如何又快又省的完成这个事情

分析下题目,只是增加了一个新的域名指向,别的内容都不变,而且每行数据都有一样的规律,分了三部分,分别是固定的address头,中间的域名,最后的IP地址。新添加的记录和老记录唯一的不同是中间域名部分增加了字符串‘.cn’

分析完毕之后,考虑怎么实现这种操作了,这里提供两个参考方向

参考一:

根据分隔符 / ,将字符串切片三部分,中间一部分再增加‘.cn’后缀即可,如使用python的split,加上字符串拼接接口实现,这里不丢实现方式,各位可以自己尝试下

参考二:

由于字符串很有规律,考虑使用正则匹配方式完成此功能,这里以 Mac机器Visual Studio Code给出匹配规则

使用正则匹配:(address=/(.+)/(.+))\n
匹配内容替换成:$1\naddress=/$2.cn/$3\n

简单解释下 () 表示 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。

$1 表示反向引用,对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。在大部分其他工具里,如notepad++ 使用 \1 表示反向引用第一个匹配内容。

\n表示换行符号,在window机器执行的时候,根据编译器的不同可能要换成 \r\n 才可以匹配结束换行符号

正则匹配涉及内容不多,但是要理解掌握需要假以时日的锻炼,一旦掌握可以极大的提高工作效率,如果还没掌握或者用的生疏了,再学习巩固下。