我有一堆包含网络事件的json文件。每个事件都包含很多内容,我试图用sed
进行IP地址匿名化(用0替换最后一段ip地址)。
简而言之:
如何从json文件中查找"ip":"34.542.3.34"
之类的子字符串并将其转换为"ip":"34.542.3.0"
?
尝试:
\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
似乎不支持重置起点。
sed -e 's/(?<="ip":"[0-9]{3}\.[0-9]{3}\.[0-9]{3}\.)([0-9]{3})/0/g' file.json
这也可以,但负面的背后似乎并不支持非固定宽度的分类。因此[0-9]{1,3}
不受支持,因此无法正常工作。
第三个想法是使用匹配的组并执行类似的操作
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
的实际效果如何。
这可能会有效,但它会使正则表达式太长而且几乎无法读取。我想找到更方便,更干净的解决方案。
有什么建议吗?
答案 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