代码之家  ›  专栏  ›  技术社区  ›  Jimbo Paul Stanley

解析多行.env文件的可解析正则表达式

  •  0
  • Jimbo Paul Stanley  · 技术社区  · 2 年前

    请注意:总有其他选择,但这更像是一个兴趣/挑战-请关注问题本身,特别是如何在Ansible中使用有效的正则表达式解析.env文件。我很接近。

    我有一个 .env 文件,我想将其解析为可解释剧本中的可解释变量。我目前使用的是 key=value 对,并且还忽略注释和新行。

    这是一个有效的正则表达式替换:

    map('regex_replace', '([^=]*)=(.*)', '\\1: \\2')

    .env 它解析的文件。

    KEY2=SOME_TEXT
    KEY3="SOME_MORE_TEXT"
    KEY4='EVEN_MORE_TEXT'
    

    问题

    但是,当我在这个文件中有一个多行变量时,例如:

    KEY1='{
        "string" = {
            "key" = "value",
            "key" = "value"
        },
        "string" = {
            "key" = "value",
            "key" = "value"
        }
    }'
    

    …然后regex仍然会解析它,但它也会更改所有 = 进入 : 在该字符串中。我想 忽视 我不知道该怎么做。

    以下是我迄今为止使用regex的完整操作手册:

    ---
    - name: Read .env file
      hosts: "localhost"
      connection: "local"
      tasks:
        - name: Get env file content
          slurp:
            src: ../.env
          register: env_file_content
    
        - name: Store env vars in playbook values
          set_fact:
            env_vars: "{{ (env_file_content.content | b64decode).split('\n') | map('regex_replace', '^#.*', '') | select | map('regex_replace', '([^=]*)=(.*)', '\\1: \\2') | join('\n') | from_yaml }}"
    
        - name: Debug output
          debug:
            var: env_vars
    

    以及 .env 文件:

    # IN TOTAL, THE REGEX SHOULD MATCH 4 KEY-VALUE PAIRS FROM THIS FILE.
    KEY1='{
        "string" = {
            "key" = "value",
            "key" = "value"
        },
        "string" = {
            "key" = "value",
            "key" = "value"
        }
    }'
    
    # DO NOT MATCH ON COMMENTS, EVEN THOSE WITH X=Y in them.
    
    # ALSO IGNORE THIS COMMENT, AND NEW LINES AROUND.
    
    KEY2=SOME_TEXT
    KEY3="SOME_MORE_TEXT"
    KEY4='EVEN_MORE_TEXT'
    

    我需要什么

    • 正则表达式需要生成四个可以在Ansible中访问的变量,例如 env_vars.KEY1
    • 正则表达式需要 不是 匹配任何内容 在内部 KEY1-需要保持原样。
    • 它还需要在每个键前面加上 PREFIX_ ,可以在 regex_replace 具有 'PREFIX_\\1: \\2' ,但您会注意到,它在 KEY1 因为当我想忽略它时,它与该变量的内容相匹配。

    如何更新到目前为止的内容来解析多行 .env 在ansible中使用Regex文件(并在每个var前面加一个字符串),这样我就可以访问四个单独的变量了?

    1 回复  |  直到 2 年前
        1
  •  1
  •   The fourth bird    2 年前

    如果要使用正则表达式,可以使用:

    ^([^"\s=]+)=('{[\s\S]*?\n}'|.*)
    

    在替换中,您可以使用 PREFIX_\\1: \\2

    模式匹配:

    • ^ 字符串的开头
    • ([^"\s=]+) 俘虏 第1组 ,匹配1个以上非空白字符 " =
    • = 按字面匹配
    • ( 俘虏 第2组
      • '{ 火柴 '{
      • [\s\S]*? 尽可能少地匹配包括换行符在内的任何字符
      • \n}' 匹配换行符,然后 }'
      • |
      • .* 不使用换行符匹配整行
    • ) 关闭组2

    请参阅 regex demo