I have to update dictionary with new value for existing key in a JSON file. I need no write new line after existing string using regex
Current file:
{
"id": "aaaa",
"desc": "Service aaa",
"boss":"[email protected]",
"email": [
"[email protected]"
],
desired file:
{
"id": "aaaa",
"desc": "Service aaa",
"boss":"[email protected]",
"email": [
"[email protected]"
"[email protected]"
]
I have this ansible lineinfile module playbook, but I struggle with decent regex. Everything I try just adds new line in the very end of file.
---
- hosts: localhost
gather_facts: no
tasks:
- name: insert line
lineinfile:
path: /home/file.json
state: present
insertafter: " ^ "email": [ "
line: '[email protected]'
How should I write correct regex in this case to write line after the string "email": [ ?
CodePudding user response:
Let's say current file is aa.txt as follows
{
"id": "aaaa",
"desc": "Service aaa",
"boss":"[email protected]",
"email": [
"[email protected]"
],
Use sed command
sed '/".*\[/!{p;d;};n;a new line' aa.txt
Output
{
"id": "aaaa",
"desc": "Service aaa",
"boss":"[email protected]",
"email": [
"[email protected]"
new line
],
Alternatively use AWK
awk '1;/".*\[/{c=2}c&&!--c{print "new text"}' aa.txt
Output
{
"id": "aaaa",
"desc": "Service aaa",
"boss":"[email protected]",
"email": [
"[email protected]"
new line
],
CodePudding user response:
quick comment :
JSON spec mandates an ASCII comma (",") between values of arrays (plus your choice of whitespace(s)), so to make the proposed solutions compliant, they would have to resemble this instead
—— (snippet directly from jq):
{
"id": "aaaa",
"desc": "Service aaa",
"boss": "[email protected]",
"email": [
"[email protected]",
"newline"
]
}
