Posso usar o sed para inserir um padrão em um arquivo?

1

Eu quero gerar um arquivo que comece no formato:

# topics-to-move.json
{
    "topics": [],
    "version": 1
}

sem { "topic": "<topic_name>" } entradas em "topics":[] . Eu posso pegar os nomes dos tópicos de outro script, o que me daria uma lista limpa de:

Topic..A
Topic..B
Topic..C

Eu gostaria de poder inserir cada um dos itens acima em um arquivo topics-to-move.json , no formato de {"topic":"Topic..A"},{"topic":"Topic..B"},{"topic":"Topic..C"} - isso pode ser feito usando sed ou algo semelhante?

Para maior clareza, o arquivo final deve se parecer com:

# topics-to-move.json
{
    "topics": [
        {"topic":"Topic..A"},
        {"topic":"Topic..B"},
        {"topic":"Topic..C"}
    ],
    "version": 1
}
    
por MrDuk 03.11.2017 / 20:37

2 respostas

2

Eu usaria uma série de comandos sed com alguns truques:

para substituir a primeira linha e marcar um ponto de partida, faça uma substituição na linha

sed -i 's/"topics": \[\],/"topics": \[/g' file.out

adicione novamente o final dessa linha e formato originais com quatro espaços pré-definidos

sed -i '/"topics": \[/a\ \ \ \ \],' file.out

crie um array a partir do seu outro arquivo

IFS=$'\n'
topic=( $(sed -n '/^Topic/p' file.in) )
unset IFS

depois, na ordem inversa da matriz, preencha os espaços entre os dois primeiros seds

for (( i=${#topic[@]}-1 ; i>=0 ; i-- )); do sed -E -i '/"topics": \[/a\ \ \ \ {"topic":"'"${topic[$i]}"'},' file.out; done

a saída é exata (salvar para uma única vírgula):

# topics-to-move.json
{
    "topics": [
        {"topic":"Topic..A"},
        {"topic":"Topic..B"},
        {"topic":"Topic..C"},
    ],
    "version": 1
}
    
por 03.11.2017 / 22:41
1

O caminho certo é usar processadores json como jq :

Assumindo o arquivo topic_names :

TopicA
TopicB
TopicC
jq --slurpfile topics <(sed 's/^\|$/"/g' topic_names) \
 '.topics = ($topics | map({"topic":.}))' topics-to-move.json

A saída:

{
  "topics": [
    {
      "topic": "TopicA"
    },
    {
      "topic": "TopicB"
    },
    {
      "topic": "TopicC"
    }
  ],
  "version": 1
}
    
por 03.11.2017 / 21:15