在字典中部分匹配的搜索和替换

3

我正在尝试根据另一个字典中的值替换一些字典中的变量,它在完全匹配时运行良好,但仅需匹配前几个单词即可。

  - debug:
      msg: "{{OS_short}}"
    loop: "{{store_os}}"
    vars:
      _dict: "{{ OS|dict2items }}"
      query: "[?contains(value, '{{ item.os_full }}')].key"
      OS_short: "{{ _dict|json_query(query) | join ('\n')}}"
    when: item.inventory.os_full is defined

需要匹配的字典:

OS:
  ios:
    - IOS
    - ios
  nxos:
    - NX-OS
    - nx-os
    - Cisco NX-OS(tm)
    #- Cisco NX-OS(tm) nxos.bla bla bla

我尝试使用“contains”和“starts_with”,但是使用“starts_with”时出现了错误信息:“expected one of: ['string'], received: \"array\""}"。” 使用“contains”时,我只得到了一个空答案。
ok: [localhost] => (item={'os_full': 'Cisco NX-OS(tm) nxos.x.x.x.x.bin, Software (nxos), Version x.y(z), RELEASE SOFTWARE Copyright (c) 2002-2019 by Cisco Systems, Inc. Compiled 3/5/2019 12:00:00'}) => {
    "msg": ""
}
1个回答

1

循环产品并搜索连接的模式。所有匹配项将添加到新列表中。例如,给定缩略数据

    store_os:
      - inventory:
          os_full: 'Cisco NX-OS(tm) nxos.x.x.x.x.bin, ...'

下面的任务:
    - set_fact:
        store_os_short: "{{ store_os_short|d([]) +
                            [{'inventory': item.0.inventory|
                                           combine({'os_short': item.1.key})}] }}"
      with_nested:
        - "{{ store_os }}"
        - "{{ OS|dict2items }}"
      when: item.0.inventory.os_full is search(item.1.value|join('|'))

提供

  store_os_short:
  - inventory:
      os_full: Cisco NX-OS(tm) nxos.x.x.x.x.bin, ...
      os_short: nxos

非常感谢,上面的解决方案完全按照您所说的和我需要的来实现了。每天都在学习新东西,一直在学习新知识。我知道这可以用正则表达式来解决,但我认为这是一个更清晰的解决方案。 - smenk
1
实际上,这是正则表达式。请参阅测试字符串。不用谢。 - Vladimir Botka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接