콜론과 괄호 사이의 두 번째 항목 바꾸기

콜론과 괄호 사이의 두 번째 항목 바꾸기

콜론 뒤의 모든 문자열을 다음과 같이 동일한 단어+밑줄+숫자로 바꿔야 합니다.

{"first": "1_first", "second": "1_second"}

예상 결과:

{"first": "first_1", "second": "second_1"}
{"first": "first_20", "second": "second_20"}
{"first": "first_33", "second": "second_33"}

첫 번째 작업을 성공적으로 완료했습니다.

echo '{"first": "first_1", "second": "second_1"}' | sed "s/\( \".*\",\)/ \"first_$j\",/"

결과 :

{"first": "first_888", "second": "second_1"}

그러나 두 번째에는 문제가 있습니다. 내 생각엔 이 표현은 너무 욕심쟁이인 것 같다.

echo '{"first": "first_1", "second": "second_1"}'|sed "s/\( \".*\)\"}/ \"second_$j\"}/"

이 문장은 너무 많이 삭제되었습니다.

{"first": "second_888"}

어쩌면 이 작업을 수행하는 좀 더 우아한 방법이 있을까요? 2개 대신 1개의 표현식을 사용하시겠습니까?

답변1

값을 키의 문자열로 바꾸면 이것이 원하는 것인지 확실하지 않습니다. 키나 값에 (이스케이프된) 따옴표가 없는 한 작동합니다. 이렇게 한다면, 혹은 가능하더라도 실제 파서를 사용하는 것이 더 좋습니다.

$ num=42
$ echo '{"foo": "xxx", "bar": "yyy"}' | \
  sed -E 's/"([^"]*)": "[^"]*"/"\1": "\1_'$num'"/g'
{"foo": "foo_42", "bar": "bar_42"}

답변2

사용jq:

$ cat data.json
{"first": "xxx", "second": "xxx"}
{"first": "yyy", "second": "yyy"}
{"first": "zzz", "second": "zzz"}

$ jq 'with_entries(.value = .key + "_42")' data.json
{
  "first": "first_42",
  "second": "second_42"
}
{
  "first": "first_42",
  "second": "second_42"
}
{
  "first": "first_42",
  "second": "second_42"
}

쉘 변수를 사용하십시오:

$ number=9
$ jq 'with_entries(.value = .key + "_'$number'")' data.json
{
  "first": "first_9",
  "second": "second_9"
}
{
  "first": "first_9",
  "second": "second_9"
}
{
  "first": "first_9",
  "second": "second_9"
}

컴팩트한 출력을 선호하는 경우:

$ jq -c 'with_entries(.value = .key + "_'$number'")' data.json
{"first":"first_9","second":"second_9"}
{"first":"first_9","second":"second_9"}
{"first":"first_9","second":"second_9"}

관련 정보