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

그런 다음 원래 줄의 끝을 다시 추가하고 선행 공백 4개로 서식을 지정합니다.

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
}

관련 정보