如何编写正确Regex使Ansible lineinfile为JSON数组添加元素?
问题描述
需要更新JSON文件中已有键对应的数组值,通过正则在指定字符串"email": [后插入新行,且不需要额外换行。但使用Ansible的lineinfile模块时,正则表达式存在问题,导致新行总是被添加到文件末尾。
当前JSON内容
{ "id": "aaaa", "desc": "Service aaa", "boss":"user@company.de", "email": [ "user@company.de" ], }
期望JSON内容
{ "id": "aaaa", "desc": "Service aaa", "boss":"user@company.de", "email": [ "user@company.de" "another_user@company.de" ] }
现有问题剧本
--- - hosts: localhost gather_facts: no tasks: - name: insert line lineinfile: path: /home/file.json state: present insertafter: " ^ \"email\": [ " line: 'another_user@company.de'
解决方案
原正则的问题
- 特殊字符未转义:正则里的
[是特殊符号,用来定义字符组,直接写会匹配任意单个字符,必须用\转义才能匹配字面量的[ - 没考虑缩进:原JSON中
"email": [前面有4个空格,你的正则用^直接匹配行首,跳过了缩进,自然找不到目标行 - 空格匹配太死板:目标行的
[前后可能有空格或换行,你写死的空格会导致匹配失败
修正后的剧本
--- - hosts: localhost gather_facts: no tasks: - name: insert email entry lineinfile: path: /home/file.json state: present # 匹配任意缩进的"email": [行,兼容空格/制表符缩进 insertafter: '^\s*"email": \[' # 保持和已有邮箱相同的缩进,加上引号保证JSON格式 line: ' "another_user@company.de"' # 可选:防止重复插入同一行 regexp: '^\s*"another_user@company.de"'
关键说明
^\s*"email": \[:\s*会匹配任意数量的空白字符(不管是空格还是制表符),解决缩进问题;\[转义后精准匹配目标行的[line参数:必须和已有邮箱保持一致的缩进(这里是8个空格),同时加上引号,不然JSON格式会出错(注:严格JSON要求数组元素间加逗号,要是需要规范格式,可以改成"another_user@company.de",)- 加
regexp是为了避免重复执行剧本时,多次插入同一个邮箱地址
内容的提问来源于stack exchange,提问作者user 01072021
相关产品推荐
相关产品推荐

