如何将任何最后一个 IP 地址八位字节(四个八位字节)替换为 0
备注:在 Linux 机器上应该由 Perl 线性实现
例如
192.9.200.124 will replaced to 192.9.200.0
完整示例:
变更前的IP地址:
more file
10.140.4.10 10.140.4.10
192.9.201 192.9.201
44.44.44 44.44.44
100.100.1 100.100.1
10.140.4.11 10.140.4.11
45.0.0 45.0.0
10.219.39.188 10.219.39.188
10.219.39.189 10.219.39.189
10.140.4.12 10.140.4.12
10.219.39.138 10.219.39.138
10.219.39.139 10.219.39.139
预期结果(更改后的IP地址)
more file
10.140.4.0 10.140.4.0
192.9.201 192.9.201
44.44.44 44.44.44
100.100.1 100.100.1
10.140.4.0 10.140.4.0
45.0.0 45.0.0
10.219.39.0 10.219.39.0
10.219.39.0 10.219.39.0
10.140.4.0 10.140.4.0
10.219.39.0 10.219.39.0
10.219.39.0 10.219.39.0
答案1
OP 最初提出了一个不同的问题。以下有 2 个解决方案可以回答这两个问题,它们相似但略有不同。
第一个解决方案
这应该做你想要的:
$ perl -pe 's/^((\d{1,3}\.){3})\d+$/${1}0/' sample.txt
10.140.4.0
192.9.201
44.44.44
100.100.1
10.140.4.0
45.0.0
10.219.39.0
10.219.39.0
10.140.4.0
10.219.39.0
10.219.39.0
解释
该位(\d{1,3}\.){3}
查找后跟句点的数字序列 (3)(长度为 1-3 位)。然后将该值保存在临时变量 ($1) 中。该字符串周围的括号保存它(\d{1,3}\.){3}). This sequence is then only matched if it's followed by a 4th octet (the 2nd \d+). All of this is then replaced with the first sequence (saved to
$1`) 后跟一个零。
样本文件
这是我使用的示例文件。 OP 发布了一个文件,其中包含一些尾随空格等,这将不允许 Perl 单行代码在不添加额外代码的情况下工作,这似乎不相关。
# sample.txt
10.140.4.10
192.9.201
44.44.44
100.100.1
10.140.4.11
45.0.0
10.219.39.188
10.219.39.189
10.140.4.12
10.219.39.138
10.219.39.139
第二种解决方案
$ perl -pe 's/^((\d{1,3}\.){3})\d+\s+((\d{1,3}\.){3})\d+/${1}0 ${3}0/'
10.140.4.0 10.140.4.0
192.9.201 192.9.201
44.44.44 44.44.44
100.100.1 100.100.1
10.140.4.0 10.140.4.0
45.0.0 45.0.0
10.219.39.0 10.219.39.0
10.219.39.0 10.219.39.0
10.140.4.0 10.140.4.0
10.219.39.0 10.219.39.0
10.219.39.0 10.219.39.0
答案2
perl -i -pe 's/(\d+\.){3}\K\d+/0/g' file
其\K
工作原理类似于后向断言,但它允许可变长度模式。
答案3
由于sed
位于您的标签中,因此这是一个sed
答案:
sed '/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/s/\.[0-9]\+$/.0/'
答案4
这是一种方法:
perl -lpe 's/\d+$/0/' filename
您应该在文件末尾附加一个空行。