我想生成一个以以下格式开头的文件:
# topics-to-move.json
{
"topics": [],
"version": 1
}
{ "topic": "<topic_name>" }
中没有条目"topics":[]
。我可以从另一个脚本中获取主题名称,这将为我提供一个干净的列表:
Topic..A
Topic..B
Topic..C
我希望能够将上述每个内容插入到一个文件中topics-to-move.json
,格式为{"topic":"Topic..A"},{"topic":"Topic..B"},{"topic":"Topic..C"}
-- 这可以使用sed
或类似的东西来实现吗?
为了清楚起见,最终文件应如下所示:
# topics-to-move.json
{
"topics": [
{"topic":"Topic..A"},
{"topic":"Topic..B"},
{"topic":"Topic..C"}
],
"version": 1
}
答案1
我会使用一系列 sed 命令和一些秘籍:
要替换第一行并标记起点,请执行行内替换
sed -i 's/"topics": \[\],/"topics": \[/g' file.out
然后重新添加原始行的结尾并使用四个前置空格进行格式化
sed -i '/"topics": \[/a\ \ \ \ \],' file.out
然后从您的其他文件构建一个数组
IFS=$'\n'
topic=( $(sed -n '/^Topic/p' file.in) )
unset IFS
然后按照数组的相反顺序,填充前两个 sed 之间的空格
for (( i=${#topic[@]}-1 ; i>=0 ; i-- )); do sed -E -i '/"topics": \[/a\ \ \ \ {"topic":"'"${topic[$i]}"'},' file.out; done
输出是准确的(除了一个逗号):
# topics-to-move.json
{
"topics": [
{"topic":"Topic..A"},
{"topic":"Topic..B"},
{"topic":"Topic..C"},
],
"version": 1
}
答案2
正确的方法是使用 json 处理器,例如杰克:
假设topic_names
文件:
TopicA
TopicB
TopicC
jq --slurpfile topics <(sed 's/^\|$/"/g' topic_names) \
'.topics = ($topics | map({"topic":.}))' topics-to-move.json
输出:
{
"topics": [
{
"topic": "TopicA"
},
{
"topic": "TopicB"
},
{
"topic": "TopicC"
}
],
"version": 1
}