JQ:如何根据正则表达式匹配替换键和值?

时间:2018-01-23 23:54:53

标签: json key edit jq

我有两个问题:

  1. 如何使用jq搜索以下划线开头的“名称”字段(如_RDS_PASSWORD)并删除前导下划线(因此它变为RDS_PASSWORD

  2. 如何将jq用于以下划线开头的“name”字段(如_RDS_PASSWORD),并传递值cGFzc3dvcmQK的值以通过base64解码? (例如:“cGFzc3dvcmQK”| base64 --decode)

  3. 输入:

    [ 
      { 
        "name": "RDS_DB_NAME", 
        "value": "rds_db_name" 
      }, 
      { 
        "name": "RDS_HOSTNAME", 
        "value": "rds_hostname" 
      }, 
      { 
        "name": "RDS_PORT", 
        "value": "1234" 
      }, 
      { 
        "name": "RDS_USERNAME", 
        "value": "rds_username" 
      }, 
      { 
        "name": "_RDS_PASSWORD", 
        "value": "cGFzc3dvcmQK" 
      } 
    ]
    

    期望的输出:

    [ 
      { 
        "name": "RDS_DB_NAME", 
        "value": "rds_db_name" 
      }, 
      { 
        "name": "RDS_HOSTNAME", 
        "value": "rds_hostname" 
      }, 
      { 
        "name": "RDS_PORT", 
        "value": "1234" 
      }, 
      { 
        "name": "RDS_USERNAME", 
        "value": "rds_username" 
      }, 
      { 
        "name": "RDS_PASSWORD", 
        "value": "password" 
      } 
    ]
    

1 个答案:

答案 0 :(得分:0)

Q1

walk( if type=="object" and has("name") and .name[0:1] == "_"
      then .name |= .[1:]
      else . 
      end) 

如果你的jq没有walk/1,那么你可以升级到更新版本的jq而不是1.5,或者包含def,可以在https://github.com/stedolan/jq/blob/master/src/builtin.jq找到

Q2

.. | objects | select(has("name") and .name[0:1] == "_") | .value 

如果您确定编码的字符串是UTF-8字符串,则可以使用jq的@ base64d;否则,使用-r选项调用jq,并按照您的计划将结果传送给解码器。