我想在使用shell脚本的特定模式之后,在.json文件中插入多行。还需要考虑在第n次出现时插入。
让我们考虑一下我的输入文件内容是:input.txt:
[
{
"a": "a",
"b": "b"
},
{
"c": "c",
"d": "d"
},
{
"e": "e",
"f": "f"
}
]
在我的第一种情况下,我必须在模式"}第一次出现后在下面插入两行">和在我的第二种情况下在第二次出现模式"strong>"}之后的相同的两行"在input.txt文件中
插入后,我的文件应该更改如下:
第一种情况:插入x&y条目的
[
{
"a": "a",
"b": "b"
},
{
"x": "x",
"y": "y"
},
{
"c": "c",
"d": "d"
},
{
"e": "e",
"f": "f"
}
]
第二种情况:插入m&n条目的
[
{
"a": "a",
"b": "b"
},
{
"c": "c",
"d": "d"
},
{
"m": "m",
"n": "n"
}
{
"e": "e",
"f": "f"
}
]
我正在使用shell scipt中的sed命令尝试此操作。但这总是替换第一次出现的和,而不是第n次出现的。
sed -e '0,/},/{//a {n "x",n "y"n },' -e '}' input.txt file
有人能帮我吗?
如果你使用jq,它就像一样简单
jq '.[:1] + [{"x":"x", "y":"y"}] + .[1:]' input.json
演示
和
jq '.[:2] + [{"m":"m", "n":"n"}] + .[2:]' input.json
演示
分别。
如果您计划重用它,可以在python中执行。
#! /usr/bin/env python3
import json
import sys
j = json.load(sys.stdin)
j.insert(int(sys.argv[1]), json.loads(sys.argv[2]))
print(j)
您可以调用它,将位置和对象作为参数
./json-insert 1 '{"x": "x", "y": "y"}' < input.json
cat file.json|tr 'n' ' '| sed 's/},/},{"x":"x", "y":"y"},/2'|json_pp
[
{
"a" : "a",
"b" : "b"
},
{
"c" : "c",
"d" : "d"
},
{
"x" : "x",
"y" : "y"
},
{
"e" : "e",
"f" : "f"
}
]
#--------------------------------------------------------------
cat file.json|tr 'n' ' '| sed 's/},/},{"x":"x", "y":"y"},/2'|json_pp > tmp.json
mv tmp.json file.json
这可能对你有用(GNU sed&Bash(:
cat <<! | sed -Ee '/}/{x;s/^/x/;/^x{1}$/{x;r /dev/stdin' -e 'x};x}' file
{
"x": "x",
"y": "y"
},
!
或:
cat <<! | sed -Ee '/}/{x;s/^/x/;/^x{2}$/{x;r /dev/stdin' -e 'x};x}' file
{
"m": "m",
"n": "n"
},
!
要通过/dev/stdin
插入sed调用的管道字符串,使用保持空间中的计数器来启动字符串的放置。
N。B.r
命令必须用换行符终止,因此使用-e
命令选项将sed命令拆分为两部分的原因。可以在here文档中收集字符串,并使用cat
命令将其传递给下面管道的/dev/stdin
。