使用sed查找并替换最后一段ip地址

时间:2017-09-04 05:35:14

标签: json regex bash sed

我有一堆包含网络事件的json文件。每个事件都包含很多内容,我试图用sed进行IP地址匿名化(用0替换最后一段ip地址)。

简而言之:

如何从json文件中查找"ip":"34.542.3.34"之类的子字符串并将其转换为"ip":"34.542.3.0"

尝试:

  1. 使用\K
  2. 重置起点

    sed -e 's/"ip":"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.\K[0-9]{1,3}/0/g' file.json

    这可行,但不幸的是sed似乎不支持重置起点。

    1. 负面的背后隐藏
    2. sed -e 's/(?<="ip":"[0-9]{3}\.[0-9]{3}\.[0-9]{3}\.)([0-9]{3})/0/g' file.json

      这也可以,但负面的背后似乎并不支持非固定宽度的分类。因此[0-9]{1,3}不受支持,因此无法正常工作。

      1. 匹配群组
      2. 第三个想法是使用匹配的组并执行类似的操作

        sed -e 's/("ip":"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|([0-9]{1,3})/\1\20/g' file.json

        但无法弄清楚这对sed的实际效果如何。

        1. 分别为每个可能的长度选项编写正则表达式
        2. 这可能会有效,但它会使正则表达式太长而且几乎无法读取。我想找到更方便,更干净的解决方案。

          有什么建议吗?

2 个答案:

答案 0 :(得分:2)

使用GNU sed:

sed -r 's/("ip":"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)[0-9]{1,3}(")/\10\2/' file

答案 1 :(得分:1)

如果没有-r - 选项:

sed -e 's/\("ip":"[[:digit:]]\{1,3\}\(\.[[:digit:]]\{1,3\}\)\{2\}\.\)\([[:digit:]]\{1,3\}\)"/\10"/g' tst.json