将“10.1.1.1-10.1.1.3”格式转换为“10.1.1.1-3”

将“10.1.1.1-10.1.1.3”格式转换为“10.1.1.1-3”

我知道这是可能的,可能通过使用awk,但我现在想不出解决方案。

如何转换 IP 格式

10.1.1.1-10.1.1.3
10.100.100.11-10.100.100.31

10.1.1.1-3
10.100.100.11-31

这是我的尝试cut,但并没有真正按预期工作。

wolf@linux:~$ echo 10.1.1.1-10.1.1.3 | cut -d . -f 1,2,3,4
10.1.1.1-10
wolf@linux:~$ 

wolf@linux:~$ echo 10.100.100.11-10.100.100.31 | cut -d . -f 1,2,3,4
10.100.100.11-10
wolf@linux:~$ 

答案1

这是使用 AWK 的通用解决方案,适应公共组件的数量:

BEGIN {
    FS = "-"
}

NF == 2 {
    split($1, start, /\./)
    split($2, end, /\./)
    printf $1
    for (i = 1; i <= length(start); i++) {
        if (start[i] != end[i]) {
            for (j = i; j <= length(end); j++)
                printf "%s%s", (j > i ? "." : "-"), end[j]
            print ""
            next
        }
    }
    print ""
}

这也将处理类似的情况1.2.3.4-1.2.5.6,打印正确的范围:

1.2.3.4-5.6

答案2

这是一个sed方法。它将查找-该行中直到最后一个的所有内容,将其保存为\1,然后将最后一次出现的 a.后跟一个或多个数字保存为\2。然后整行被替换为\1\2

$ sed -E 's/(.*-).*\.([0-9]+)/\1\2/' file 
10.1.1.1-3
10.100.100.11-31

或者,在 中awk,您可以将输入字段分隔符设置为.-,将输出字段分隔符设置为.,然后打印第一个字段到第四个字段,即 a-和最后一个字段:

$ awk -F'[-.]' -vOFS="." '{print $1,$2,$3,$4"-"$NF}' file 
10.1.1.1-3
10.100.100.11-31

答案3

一个选项awk

awk -F'[.-]' '{ print $1"."$2"."$3"."$4"-"$8 }'

输出:

10.1.1.1-3
10.100.100.11-31

答案4

$ sed 's/-.*\./-/' file
10.1.1.1-3
10.100.100.11-31

相关内容