对于特殊情况,我设置了一个域地址,可以将其转换为(内部)IP地址。
001002003004.test.com应恢复为1.2.3.4作为IP。
我来到以下SED系列,但我感觉它非常笨重,可以做得更轻松! 对于一个案例,它不起作用,虽然这种情况不太可能存在,但我希望它有效。
我的数据:
user@linuxmachine:/home/user# cat regex.test
010005248210.test.com
172017170003.test.com
172000017003.test.com
001002003004.test.com
000000000001.test.com
091021000103.test.com
192168123254.test.com
172000000010.test.com
我的转型线:
cat regex.test | sed -r 's/([0-9]{3})/\1\./g' | sed -r "s/^0*//" | sed -r "s/\.0*/\./g" | sed -r "s/\.\.test.com//" | sed -r "s/\.\./\.0\./g"
输出:
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
.0..1
91.21.0.103
192.168.123.254
172.0..10
000000000001.test.com不需要工作,因为这是一个不可能的IP。但是172000000010.test.com我需要工作。
我当时认为最终SED上的g标志会取代所有出现的......但它似乎并非如此。我该怎么做才能改善这个?
答案 0 :(得分:4)
我会使用gawk(> = 4.0)的FPAT
:
使用您的文件进行测试:
kent$ awk -v FPAT='.{3}' '{printf "%d.%d.%d.%d\n",$1+0,$2+0,$3+0,$4+0}' file
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
0.0.0.1
91.21.0.103
192.168.123.254
172.0.0.10
答案 1 :(得分:2)
与Idriss相同,但更短:
sed -r 's/([0-9]{3})/\1\./g;s/(^|\.)0*([0-9]+)/\1\2/g;s/\.\.test.com//' regex.test
答案 2 :(得分:2)
以下是使用awk
awk '{for (i=1;i<11;i+=3) printf substr($0,i,3)+0(i==10?RS:".")}' file
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
0.0.0.1
91.21.0.103
192.168.123.254
172.0.0.10
答案 3 :(得分:1)
首先,无需使用cat
,也无需使用多个sed
。你可以使用:
sed -r 's/([0-9]{3})/\1\./g;s/^0*//;s/\.0*/\./g;s/\.\.test.com//;s/\.\./\.0\./g' regex.test
而不是:
cat regex.test | sed -r 's/([0-9]{3})/\1\./g' | sed -r "s/^0*//" | sed -r "s/\.0*/\./g" | sed -r "s/\.\.test.com//" | sed -r "s/\.\./\.0\./g"
你会得到相同的结果(这还不正确)。
然后,这是一个适用于单个sed
的解决方案:
$ sed -r 's/([0-9]{3})/\1\./g;s/\.\.test.com//;s/0+([0-9]+\.?)/\1/g' regex.test
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
0.0.0.1
91.21.0.13
192.168.123.254
172.0.0.10
答案 4 :(得分:1)
这是另一个GNU sed替代方案:
<regex.test sed -r 's/\..*//; s/.{3}/&./g; s/(^|\.)0{1,2}/\1/g; s/\.$//'
如果您允许使用cut
:
<regex.test cut -d. -f1 | sed -r 's/.{3}/&./g; s/(^|\.)0{1,2}/\1/g; s/\.$//'
来自GNU coreutils的 cut
也可用于分隔组:
<regex.test cut --output-delimiter=. -c1-3,4-6,7-9,10-12 | sed -r 's/(^|\.)0{1,2}/\1/g'
所有情况下的输出:
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
0.0.0.1
91.21.0.103
192.168.123.254
172.0.0.10
答案 5 :(得分:1)
逐步删除以0开头为IP并从每个数字前导0开始的行(空)
sed -e 's/\..*//;s/\(...\)/.\1/g;s/\.0\{0,2\}/./g;s/.\(0.*\)*//' regex.test
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
91.21.0.103
192.168.123.254
答案 6 :(得分:1)
更简单的sed
命令,
sed -r 's/^([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3}).*$/\1.\2.\3.\4/g; s/(^|\.)0*([0-9]+)/\1\2/g' file
示例:
$ sed -r 's/^([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3}).*$/\1.\2.\3.\4/g; s/(^|\.)0*([0-9]+)/\1\2/g' rr
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
0.0.0.1
91.21.0.103
192.168.123.254
172.0.0.10
或强>
sed -r 's/^([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3}).*$/\1.\2.\3.\4/g; s/0+([0-9]+\.?)/\1/g' file
示例:
$ sed -r 's/^([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3}).*$/\1.\2.\3.\4/g; s/0+([0-9]+\.?)/\1/g' file
10.5.248.210
172.17.170.3
172.0.17.3
1.2.3.4
0.0.0.1
91.21.0.13
192.168.123.254
172.0.0.10