This question already has answers here:
grep + match exactly IP address with Regular Expression
                                
                                    (4个答案)
                                
                        
                                7年前关闭。
            
                    
以下perl one班轮代码的目标是替换前三个八位位组(如果四个八位位组是digit / number-xxx.xxx.xxx.digit)


备注-我使用linux和solaris机器


问题是,当四个八位位组IP无效IP八位位组时,perl one衬里也会替换前三个八位位组(例如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之间)时

最佳答案

如果最后一个八位位组始终只是一个数字,则可以执行与模式开始时相同的操作,并确保第一个八位位组之后没有数字。

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

09-11 13:13