我想在此方面寻求您的帮助:我有这些IPv6:
29c4:fe34:5:2087:86b8:2ff:fed1:9f24
2c0f:f4b8:1:2092:51:6ff:fe81:c600
各部分用“:”分隔,我需要找到从第五部分到第八部分少于4位数字的组,并添加“ 0”以具有类似这样的内容:
29c4:fe34:5:2087:86b8:02ff:fed1:9f24
2c0f:f4b8:1:2092:0051:06ff:fe81:c600
我尝试过sed,但没有成功...老实说,我不知道该怎么做。
非常感谢。
awk 'BEGIN{FS=OFS=":"}/./{for(i=5;i<=8;i++) if(length($i)<4) $i=sprintf("%04d",$i);}1'
29c4:fe34:5:2087:86b8:0002:fed1:9f24
2c0f:f4b8:1:2092:0051:0006:fe81:c600
BEGIN{FS=OFS=":"}
:输入和输出字段用:
符号分隔。/./
:如果两个ipv6 ip地址之间有空行,则此选项是可选的。{for(i=5;i<=8;i++)
:这是要分别检查字段5至8中的每个字段。if(length($i)<4
:如果长度小于4,请使用sprintf
功能用前导零填充该字段。
请您尝试sed
解决方案:
sed -E ':l;s/^(([^:]+:){4,})(\b[[:xdigit:]]{1,3}\b)/\10\3/g;tl' inputfile
结果:
29c4:fe34:5:2087:86b8:02ff:fed1:9f24
2c0f:f4b8:1:2092:0051:06ff:fe81:c600
[说明]
:l
定义要循环的标签l
。(([^:]+:){4,})
将匹配前四个或更多保留它们的字段。(\b[[:xdigit:]]{1,3}\b)
将匹配十六进制值少于四位数。s
命令将通过添加前导零来替换它,表达式\10\3
,它是\ 1,“ 0”和\ 3的串联。tl
命令,最后的l
命令分支到标签s
成功。然后尝试下一次替换。