使用shell脚本在文件中插入多行



我想在使用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

相关内容

  • 没有找到相关文章

最新更新