我有一个文件,其中包括一个json。 json包含需要屏蔽的密码。负责掩码的bash脚本无法知道实际的密码本身,所以它不是一个简单的sed搜索和替换。
密码在名为" 密码"的常量键下显示在json中。或" 密码"。通常情况下,外观就像 -
...random content..."Password\":\"actualPWD\"...random content....
bash脚本需要将此类外观更改为 -
...random content..."Password\":\"******\"...random content....
引用并不重要,所以即使......随机
content..."Password\":******...random content...
会起作用。
我认为逻辑需要找到':'的索引。出现在文本"密码" /"密码"然后从该点开始子串,直到第二次出现引用(")并用*****替换整个事物。但我不知道如何用sed或awk做到这一点。任何建议都会有所帮助。
答案 0 :(得分:0)
Perl救援!
perl -pe 's/("[Pp]assword\\":\\")(.*?)(\\")/$1 . ("." x length $2) . $3/ge'
/e
将替换部分解释为代码,因此您可以使用重复运算符x
并重复点length $2
次。
答案 1 :(得分:0)
由于JSON是结构化的,任何基于正则表达式的方法都会在某些时候失败,除非输入以某种方式受到约束。使用JSON感知方法会更好(更简单,更安全)。
值得了解的一个特别优雅的JSON感知工具是jq。 (是的,“j”代表JSON: - )
假设我们有一个由有效JSON组成的输入文件,并且我们想要将每个“password”或“Password”键的值更改为“******”(无论具有这些的对象有多深层嵌套)密钥可能是),我们可以按如下方式进行:
将以下内容放入文件中,例如mask.jq:
def mask(p): if has(p) then .[p] = "******" else . end;
.. |= if type == "object"
then mask("password") | mask("Password") else . end
现在假设in.json有这个JSON:
{"password": "secret", "details": [ {"Password": "another secret"} ]}
然后执行命令:
jq -f mask.jq in.json
产生
{
"password": "******",
"details": [
{
"Password": "******"
}
]
}
的jq