在一行的一部分中添加/替换字符

问题描述 投票:0回答:2

我想在此方面寻求您的帮助:我有这些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,但没有成功...老实说,我不知道该怎么做。

非常感谢。

sed add
2个回答
0
投票
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功能用前导零填充该字段。


0
投票

请您尝试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成功。然后尝试下一次替换。
© www.soinside.com 2019 - 2024. All rights reserved.