首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl +仅在八位组为有效IP时才替换IP地址

perl +仅在八位组为有效IP时才替换IP地址
EN

Stack Overflow用户
提问于 2013-03-01 10:25:08
回答 3查看 659关注 0票数 0

下面perl一行代码的目标是替换前三个八进制(如果四个八进制是数字/数字-xxx.digit)

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

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

下面的perl一行代码示例展示了perl语法如何替换前三个八进制,尽管这四个八进制不是有效的IP。

代码语言:javascript
复制
# 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一行代码中添加哪些内容,以替换前三个八进制

如果四个八位组为有效IP (介于0-255之间),则仅为。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-01 10:40:17

如果最后一个八位数总是一个数字,那么您可以在模式开始时做同样的操作,并确保在第一个数字之后没有数字。

代码语言:javascript
复制
s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.\d(?!\d))/$ENV{NEW_IP}/g

这种方法比在0到255之间检查有效的最后八进制要容易得多,这看起来像

代码语言:javascript
复制
s/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.(?:1?\d?\d|2[0-4][0-9]|25[0-5])(?!\d))/$ENV{NEW_IP}/g
票数 0
EN

Stack Overflow用户

发布于 2013-03-01 10:45:15

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

下一个表示法应该开始了,它检查不同的组,单数0到9,双位0到9,三位数从1开始,三位数从2开始,但是后面没有5,三位数后面5限制5对于第三位数。

代码语言:javascript
复制
^(?:[23456789]|[0123456789][0123456789]|1[0123456789][0123456789]|2[01234][0123456789]|25[012345]?)$

是否在在线regex测试器中测试过,而且它似乎很好地过滤了它。

我对PERL的了解已经超过十二年了,但是不应该有可能获得输出并检查其价值:

代码语言:javascript
复制
/\d\.\d\.\d\.(\d)/ if $1 < 255
票数 0
EN

Stack Overflow用户

发布于 2013-03-01 13:24:07

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

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

测试:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15155406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档