파일에서 큰따옴표로 묶인 세 번째 단어 바꾸기

파일에서 큰따옴표로 묶인 세 번째 단어 바꾸기

이것이 json우리가 편집하려는 파일 입니다

실시예 1

{
  "topics": [{"topic": "hfgt_kejd_tdsfd”}],
  "version": 1
}

실시예 2

{
  "topics": [{"topic": "hfgt_kj_fsrfdfd”}],
  "version": 1
}

topics줄의 세 번째 단어를 다른 단어로 바꾸고 싶습니다 (sed 또는 perl oneliner를 통해).

~에 대한실시예 1, 다음으로 바꾸려고 할 hfgt_kejd_tdsfd때 예상되는 결과test_1

{
  "topics": [{"topic": "test_1”}],
  "version": 1
}

실시예 3

more /tmp/file.json

{
  "topics": [{"topic": "TOPIC_GGGG”}],
  "version": 1
}


# sed  's/\(topic\": "\)[a-z_]*/\1test_1/'  /tmp/file.json

{
  "topics": [{"topic": "test_1TOPIC_GGGG”}],
  "version": 1
}

답변1

사용 jq:

$ jq '.topics[0].topic |= "test_1"' file.json
{
  "topics": [
    {
      "topic": "test_1"
    }
  ],
  "version": 1
}

topic이는 JSON 문서를 읽고 배열의 첫 번째 요소 항목 값을 topicsstring 으로 수정합니다 test_1.

변수에 값(UTF-8로 인코딩됨)이 있는 경우:

$ val='Some value with "double quotes"'
$ jq --arg string "$val"  '.topics[0].topic |= $string' file.json
{
  "topics": [
    {
      "topic": "Some value with \"double quotes\""
    }
  ],
  "version": 1
}

펄 사용:

$ perl -MJSON -0777 -e '$h=decode_json(<>); $h->{topics}[0]{topic}="test_1"; print encode_json($h), "\n"' file.json
{"topics":[{"topic":"test_1"}],"version":1}

변수 사용:

$ val='Some value with "double quotes"'
$ STRING=$val perl -MJSON -0777 -e '$string = $ENV{STRING}; utf8::decode $string; $h=decode_json(<>); $h->{topics}[0]{topic}=$string; print encode_json($h), "\n"' file.json
{"topics":[{"topic":"Some value with \"double quotes\""}],"version":1}

둘 다 Perl JSON모듈을 사용하여 JSON 문서를 디코딩하고 변경해야 할 값을 변경한 다음 다시 인코딩된 데이터 구조를 출력합니다. 오류 처리는 연습으로 남겨둡니다.

두 번째 코드 부분에서는 삽입할 값이 STRINGPerl 코드에 환경 변수로 전달됩니다. 이는 "slurp" 모드의 파일에서 JSON 문서를 읽기 때문입니다 -0777.

답변2

match [A-Za-z_](대부분의 로케일에서 영어 문자와 밑줄보다 훨씬 더 많이 일치함)를 사용하는 대신 [^"]다음을 사용하세요.제거하다"(그런데 질문의 예에는 제목 이름 뒤의 닫는 따옴표로 json 인용문( , U+0022, ) 대신 (U+201D, )가 있습니다 . 원본 예제 파일에서는 그렇지 않다고 가정합니다. , 이렇게 하면 json이 유효하지 않게 됩니다):RIGHT DOUBLE QUOTATION MARK"QUOTATION MARK

sed 's/\("topic": "\)[^"]*/\1test_1/' < file.json

(주제 이름 대체가 올바르게 JSON으로 인코딩되었는지 확인하는 것은 사용자의 책임입니다. 즉, UTF-8 문자 세트, 인코딩된 제어 문자(예: \n줄 바꿈) 및 "로 인코딩됩니다 \".

답변3

sed -i 's/\(topic\": "\)[A-Za-z_]*/\1test_1/' file.json

관련 정보