【问题标题】:Ansible regex_findall multiple stringsAnsible regex_findall 多个字符串
【发布时间】:2019-02-11 16:36:47
【问题描述】:

Cisco IOS 路由器,做一个“dir”,我想抓取所有名称中带有“.bin”的文件名。

示例字符串: flash0的目录:/

1  -rw-    95890300  May 24 2015 11:27:22 +00:00  c2900-universalk9-mz.SPA.153-3.M5.bin
2  -rw-    68569216   Feb 8 2019 20:15:26 +00:00  c3900e-universalk9-mz.SPA.151-4.M10.bin
3  -rw-       46880  Oct 25 2017 19:08:56 +00:00  pdcamadeusrtra-cfg
4  -rw-         600   Feb 1 2019 19:36:44 +00:00  vlan.dat

总共 260153344 字节(95637504 字节免费)

我已经知道如何提取“bin”,但我不知道如何提取整个文件名(以“c”开头,以“bin”结尾),因为我想使用这些值并删除不需要的文件。

我是编程新手,所以正则表达式示例有点令人困惑。

【问题讨论】:

    标签: ios regex ansible findall


    【解决方案1】:

    你可以使用这个正则表达式

    ^[\w\W]+?(?=(c.*\.bin))\1$
    
    • ^ - 字符串开头。
    • [\w\W]+? - 匹配任何东西一次或多次(懒惰模式)。
    • (?=(c.*\.bin)) - 正向前瞻匹配 c 后跟 \.bin (第 1 组)
    • \1 - 匹配组 1。
    • $ - 字符串结束。

    Demo

    【讨论】:

    • 有效,但只返回找到的最后一个实例:ok: [10.35.91.200] => changed=false ansible_facts: binfiles: - c2800nm-adventerprisek9-mz.151-4.M12a.bin
    • @你是什么意思?你检查过你使用了正确的标志吗?
    • 声明如下: binfiles="{{ dir_response.stdout[0] | regex_findall('[\w\W]+?(?=(c.*\.bin))\1$ ') }}" 结果如下:TASK [set_fact] ************************************ ****************************************************** ****************** 任务路径:/export/home/e130885/playbooks/ios-switch-upgrade/ios_clean_flash.yml:16 2019 年 2 月 11 日星期一 11:31:47 -0600 (0:00:00.386) 0:00:03.037 ******* ok: [10.35.91.200] => changed=false ansible_facts: binfiles: - c2800nm-adventerprisek9-mz.151-4.M12a。 bin META:运行处理程序 META:运行处理程序谢谢!
    • 那么"{{ dir_response.stdout[0] }} 的连体衣长什么样子?
    • 任务[调试] ****************************************** ****************************************************** ******************* 2019 年 2 月 11 日星期一 12:46:17 -0600 (0:00:02.752) 0:00:02.815 ******* 好的:[10.35.91.200] => 味精:- |- 1 -rw- 95890300 2015 年 5 月 24 日 11:27:22 +00:00 c2900-universalk9-mz.SPA.153-3.M5.bin 2 -rw- 68569216 2019 年 2 月 8 日 20:15:26 +00:00 c3900e-universalk9-mz.SPA.151-4.M10.bin 5 -rw- 67929600 2019 年 2 月 8 日 21:24:56 +00:00 c2800nm-adventerprisek9-mz。 151-4.M12a.bin
    【解决方案2】:

    要匹配以c(或字符串开头)开头的文件名,您可以在(?<!\S) 后面使用否定的lookbehind 来检查左边不是非空白字符。

    然后匹配 1 次以上非空白字符 \S+ 或在字符类 [\w.-]+ 中列出允许匹配的字符。之后匹配一个点\.,然后是bin

    最后,您可以使用单词边界 \b 来防止 bin 成为更大单词的一部分:

    (?<!\S)[\w.-]+\.bin\b
    

    regex101 demo

    【讨论】:

      【解决方案3】:

      感谢代码狂人! 您的代码找到了一个实例,而我需要找到所有实例。使用你给我的东西加上一些其他的例子,我发现这是可行的:

      binfiles="{{ dir_response.stdout[0] | regex_findall('\b(?=(c.*.bin))\b') }}"

      现在我明白了: 任务 [set_fact] ************************************************ ****************************************************** ******** 任务路径:/export/home/e130885/playbooks/ios-switch-upgrade/ios_clean_flash.yml:16 2019 年 2 月 12 日星期二 08:29:58 -0600 (0:00:00.350) 0:00:03.028 ****** 好的:[10.35.91.200] => 改变=假 ansible_facts: 二进制文件: - c2900-universalk9-mz.SPA.153-3.M5.bin - c3900e-universalk9-mz.SPA.151-4.M10.bin - c2800nm-adventerprisek9-mz.151-4.M12a.bin

      接下来的任务是弄清楚如何使用每个元素。谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 2018-01-06
        • 2021-11-24
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多