【问题标题】:perl + Replace IP address only if octet is VALID IP [duplicate]perl +仅当八位字节为有效IP时才替换IP地址[重复]
【发布时间】:2013-02-15 19:36:18
【问题描述】:

下面的 perl one liner 代码的目标是替换前三个八位字节(如果四个八位字节是数字/数字 - xxx.xxx.xxx.digit)

  • remark - 我用的是linux和solaris机器

问题是 perl one 行也将替换前三个八位字节,而四个八位字节 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 一行代码中添加什么, 为了替换前三个八位字节

如果四个八位字节是 VALID IP(介于 0 - 255 之间)

【问题讨论】:

  • 你上一个问题怎么没有回答?
  • ikagami - 不是同一个quastion,在这种情况下我问的是如何编辑文件,而不是像previos quastion那样谈论如何匹配,previos quastion不能帮助我编辑文件!
  • @Ikegami 请告诉我如何使用 previos quastion 编辑文件(替换 IP) - grep + 使用正则表达式精确匹配 IP 地址????????

标签: linux perl bash shell ksh


【解决方案1】:

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

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

【讨论】:

  • 目标是检查最后一个八位字节的有效性 - 所以我们必须验证最后一个八位字节在 0 到 255 之间,
  • 那你为什么说“如果四个八位字节是数字/数字 - xxx.xxx.xxx.digit”
【解决方案2】:

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

下一个表达式应该让你开始,它检查不同的组,个位数 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

【讨论】:

    【解决方案3】:

    这是一个使用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
    

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 2021-08-26
      • 2018-09-19
      • 2014-05-13
      • 2015-11-02
      相关资源
      最近更新 更多