以下perl one liner代码的目标是替换前三个八位字节(如果四个八位位组是数字/数字 - xxx.xxx.xxx.digit)
问题是perl one liner还将替换前三个八位位组,而四个八位位组IP不是有效的IP八位位组(例如5.5.5.555)
下面的perl one liner代码示例显示了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单线代码中建议需要添加的内容, 为了取代前三个八位字节
仅如果四个八位字节是有效IP(0到255之间)
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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