Bash - 基于索引的子串

时间:2015-12-16 22:43:02

标签: string bash shell awk sed

我有一个文件,其中包括一个json。 json包含需要屏蔽的密码。负责掩码的bash脚本无法知道实际的密码本身,所以它不是一个简单的sed搜索和替换。

密码在名为" 密码"的常量键下显示在json中。或" 密码"。通常情况下,外观就像 -

...random content..."Password\":\"actualPWD\"...random content.... 

bash脚本需要将此类外观更改为 -

...random content..."Password\":\"******\"...random content.... 

引用并不重要,所以即使......随机

content..."Password\":******...random content...

会起作用。

我认为逻辑需要找到':'的索引。出现在文本"密码" /"密码"然后从该点开始子串,直到第二次出现引用(")并用*****替换整个事物。但我不知道如何用sed或awk做到这一点。任何建议都会有所帮助。

2 个答案:

答案 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": "******"
    }
  ]
}

更多关于https://github.com/stedolan/jq

的jq