JQ с регулярным выражением для сопоставления ключей, которые не соответствуют регулярному выражению - PullRequest
0 голосов
/ 19 марта 2020

я использовал следующую команду, чтобы массировать файл json и получить значения его ключей, чтобы иметь возможность сопоставлять их с определенным регулярным выражением: cat jsonfile | jq 'to_entries',

чтобы выяснить все ключи (напечатайте их), которые не соответствуют шаблону ^ key \ d \ d $, и команда ниже - самая близкая, которую я придумала: но я получаю ошибки. Как мне его изменить?

cat jsonfile|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )' 


{"root":{"parent":"57g1"},"start":"{"key00":"011","key01":"57","key005":"1616.0","key11010":[["  ",["element","90-76871-10-8"]]],"key9100":[["  ",["element","20890"]]],"keya1":[["0 ",["element","dut"]]],"key8102":[["  ",["element","AN"]]],"key8":[[" 0",["element","987"],["87","o/ 0"],["3","09"],["8","9847"]],[" 1",["element","488"],["4","897"],["7","9"]]]}"}
{"root":{"parent":"57d1"},"start":"{"key001-no":"0500","key001":"57ec001","key1105":"6.0","key77010":[["  ",["element","978-605-377-046-6"]]],"key7800":[["  ",["element","201jh"]]],"key18701":[[" 0",["element","99"],["ik","767"],["88","28"],["87","jkh"]],[" 1",["element","98"],["gh","87"],["hg","8"]]]}"}

желаемый вывод:

"parent":"57d1"
"parent":"57g1"

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

К сожалению, пример ввода неверен JSON, и кажется, что вывод, как показано, не соответствует описанию проблемы. Здесь, однако, есть решение проблемы, как заявлено, с входным значением выборки JSON, близко соответствующим данному образцу, вместе с соответствующим выходным сигналом. Надеемся, что если вы пересмотрите свои требования, вы легко сможете соответствующим образом изменить программу.

paths as $p
| getpath($p) as $v
| select($v | scalars)
| select( $p[-1] | (type == "string") and (test("^key[0-9][0-9]$")|not))
| "\($p[-1]):\($v)"

Пример ввода

{
  "root": {
    "parent": "57g1"
  },
  "start": {
    "key00": "011",
    "key01": "57",
    "key005": "1616.0",
    "key11010": [
      [
        "  ",
        [
          "element",
          "90-76871-10-8"
        ]
      ]
    ],
    "key9100": [
      [
        "  ",
        [
          "element",
          "20890"
        ]
      ]
    ],
    "keya1": [
      [
        "0 ",
        [
          "element",
          "dut"
        ]
      ]
    ],
    "key8102": [
      [
        "  ",
        [
          "element",
          "AN"
        ]
      ]
    ],
    "key8": [
      [
        " 0",
        [
          "element",
          "987"
        ],
        [
          "87",
          "o/ 0"
        ],
        [
          "3",
          "09"
        ],
        [
          "8",
          "9847"
        ]
      ],
      [
        " 1",
        [
          "element",
          "488"
        ],
        [
          "4",
          "897"
        ],
        [
          "7",
          "9"
        ]
      ]
    ]
  }
}
{
  "root": {
    "parent": "57d1"
  },
  "start": {
    "key001-no": "0500",
    "key001": "57ec001",
    "key1105": "6.0",
    "key77010": [
      [
        "  ",
        [
          "element",
          "978-605-377-046-6"
        ]
      ]
    ],
    "key7800": [
      [
        "  ",
        [
          "element",
          "201jh"
        ]
      ]
    ],
    "key18701": [
      [
        " 0",
        [
          "element",
          "99"
        ],
        [
          "ik",
          "767"
        ],
        [
          "88",
          "28"
        ],
        [
          "87",
          "jkh"
        ]
      ],
      [
        " 1",
        [
          "element",
          "98"
        ],
        [
          "gh",
          "87"
        ],
        [
          "hg",
          "8"
        ]
      ]
    ]
  }
}

Соответствующий вывод

"parent:57g1"
"key005:1616.0"
"parent:57d1"
"key001-no:0500"
"key001:57ec001"
"key1105:6.0"
0 голосов
/ 19 марта 2020

Вы можете фильтровать объекты, у которых нет ключа, соответствующего регулярному выражению, например:

jq '.[] | select(.key|test("^key[0-9][0-9]$")|not)'
...