【问题标题】:Finding and replacing last segment of ip addresses with sed用 sed 查找和替换最后一段 IP 地址
【发布时间】:2018-02-12 07:46:35
【问题描述】:

我有一堆包含网络事件的 json 文件。每个事件都包含很多东西,我正在尝试使用sed 进行 IP 地址匿名化(将 IP 地址的最后一段替换为 0)。

简而言之:

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

尝试:

  1. 用\K重置起点

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. 消极的后视

sed -e 's/(?<="ip":"[0-9]{3}\.[0-9]{3}\.[0-9]{3}\.)([0-9]{3})/0/g' file.json

这也可以,但负面的lookbehind 似乎不支持非固定宽度的分类。所以[0-9]{1,3} 不受支持,因此这不起作用。

  1. 匹配组

第三个想法是使用匹配组并做类似的事情

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. 分别为每个可能的长度选项编写正则表达式

这可能会起作用,但它会使正则表达式太长且难以阅读。我想找到更方便、更干净的解决方案。

有什么建议吗?

【问题讨论】:

  • 您的 json 文件是否具有相同的格式结构(级别)?发布其中一个

标签: json regex bash sed


【解决方案1】:

当没有-r-option 时:

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2017-01-07
      • 2020-08-05
      • 2016-06-24
      • 2020-06-24
      相关资源
      最近更新 更多