下面perl一行代码的目标是替换前三个八进制(如果四个八进制是数字/数字-xxx.digit)
问题是perl一行也将替换前三个八位字节,而四个八位组IP不是有效的IP八位组(例如5.5.5.555 )
下面的perl一行代码示例展示了perl语法如何替换前三个八进制,尽管这四个八进制不是有效的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一行代码中添加哪些内容,以替换前三个八进制
如果四个八位组为有效IP (介于0-255之间),则仅为。
发布于 2013-03-01 10:40:17
如果最后一个八位数总是一个数字,那么您可以在模式开始时做同样的操作,并确保在第一个数字之后没有数字。
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-01 10:45:15
我的第一个想法是使用正则表达式:
下一个表示法应该开始了,它检查不同的组,单数0到9,双位0到9,三位数从1开始,三位数从2开始,但是后面没有5,三位数后面5限制5对于第三位数。
^(?:[23456789]|[0123456789][0123456789]|1[0123456789][0123456789]|2[01234][0123456789]|25[012345]?)$是否在在线regex测试器中测试过,而且它似乎很好地过滤了它。
我对PERL的了解已经超过十二年了,但是不应该有可能获得输出并检查其价值:
/\d\.\d\.\d\.(\d)/ if $1 < 255发布于 2013-03-01 13:24:07
下面是使用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.256https://stackoverflow.com/questions/15155406
复制相似问题