我可以使用 sed 将模式插入文件吗?

我可以使用 sed 将模式插入文件吗?

我想生成一个以以下格式开头的文件:

# 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
}

相关内容