IPS 参数包括差异 IP 地址:
IPS="192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127"
我想替换第三个“。” IP地址中的数字以“,”
如何通过sed
or实现这一点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'