0

以下 perl 单行代码的目标是替换前三个八位字节(如果四个八位字节是 digit/number - xxx.xxx.xxx.digit )

  • 备注 - 我使用 linux 和 solaris 机器

问题是 perl one 行也将替换前三个八位字节,而四个八位字节 IP 不是有效的 IP 八位字节(例如 5.5.5.555 )

以下 perl 单行代码示例显示了 perl 语法如何替换前三个八位字节,尽管四个八位字节不是 VALID IP

# export OLD_IP=1.1.1
# export NEW_IP=5.5.5
# echo 1.1.1.555 | perl -i -pe 'next if /^ *#/; s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.\d)/$ENV{NEW_IP}/g'
5.5.5.555

请告知需要在我的 perl 单行代码中添加什么,以替换前三个八位位组

当四个八位字节为 VALID IP(介于 0 – 255 之间)

4

3 回答 3

0

这是使用eval标志进行替换的简单解决方案:

perl -i -pe 's/\b(1\.1\.1\.(\d+))\b/ $2 >= 0 && $2 < 255 ? "5.5.5.$2" : $1/ge'

测试:

echo 1.1.1.12 | perl -i -pe 's/\b(1\.1\.1\.(\d+))\b/ $2 >= 0 && $2 < 255 ? "5.5.5.$2" : $1/ge'
5.5.5.12

echo 1.2.1.256 | perl -i -pe 's/\b(1\.1\.1\.(\d+))\b/ $2 >= 0 && $2 <= 255 ? "5.5.5.$2" : $1/ge'
1.2.1.256
于 2013-03-01T13:24:07.390 回答
0

如果最后的八位字节总是只有一个数字,那么您可以在模式的开头执行相同的操作,并确保第一个八位字节之后没有数字。

s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.\d(?!\d))/$ENV{NEW_IP}/g

这种方式比检查从 0 到 255 的有效最终八位字节要容易得多,看起来像

s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.(?:1?\d?\d|2[0-4][0-9]|25[0-5])(?!\d))/$ENV{NEW_IP}/g
于 2013-03-01T10:40:17.823 回答
0

我的第一个想法是使用正则表达式:

下一个表达式应该让你开始,它检查不同的组,个位数 0 到 9,两位数 0 到 9,三位数以 1 开头,三位数以 2 开头但不跟 5,三位数跟 5 限制为 5第三位数

^(?:[23456789]|[0123456789][0123456789]|1[0123456789][0123456789]|2[01234][0123456789]|25[012345]?)$

确实在在线正则表达式测试器中对其进行了测试,并且似乎很好地过滤了它

我对 PERL 的了解已经超过 12 年了,但不应该得到输出并检查它的价值吗:

/\d\.\d\.\d\.(\d)/ if $1 < 255
于 2013-03-01T10:45:15.493 回答