如何将数字中的第三个字符替换为其他字符

如何将数字中的第三个字符替换为其他字符

IPS 参数包括差异 IP 地址:

IPS="192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127"

我想替换第三个“。” IP地址中的数字以“,”

如何通过sedor实现这一点awk

例子:

echo $IPS | sed ……..

请求的输出

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

答案1

就在外壳中:

IPS='192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127'
echo $(IFS=\ .; printf %s.%s.%s,%s\  $IPS)

输出

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

但更好的方法 - 您可以实际使用数组的方法 - 是将其转换为函数:

iprng() (IFS=.;for ip do printf %s.%s.%s,%s\\n $ip; done)
iprng $IPS

输出

192.9.200,12-14
172.17.200,12-89
12.21.1,10-25
127.0.0,1-127

或者...

echo $(iprng $IPS) 

输出

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

正如您所看到的,它实际上与其他地方完成的操作相同,awk只是它完成得更简单并且无需调用另一个可执行文件。

答案2

将所有内容匹配到最后一个点并在一组中记住它:

$ echo $IPS | sed 's/\([^ ]*\)\./\1,/g'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

答案3

捕获与 IP 地址的八位字节匹配的第一组和第二组,并返回那些用逗号字符代替范围之前的点的组:

echo ${IPS}|perl -pe 's!(\d{1,3}\.\d{1,3}\.\d{1,3})\.(\d+-\d+\s+)!$1,$2!g'

使用 Perl,我们可以\d用“\s”表示数字和空格。

答案4

如果您使用perl,您可以:

echo "${IPS}" | perl -pe 's/\./(++$c%3==0)?",":"."/ge'

相关内容