각 줄에서 JSON 데이터의 일부를 제거하는 명령이요?

각 줄에서 JSON 데이터의 일부를 제거하는 명령이요?

test.json행 길이가 다른 파일이 있습니다 . 몇 가지 가상의 예:

{ a: 123, b: sd, c: x45, d: 1, e: '' }
{ a: 5, b: bfgg, c: x4c, d: 31, e: '' }

d- 부분 이후 전체 하위 문자열을 잘라내고 모든 줄에 대해 다시 가져오고 싶습니다 .

{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

나는 찾았다여기비슷한 질문에 내 문제를 적용하려고했습니다.

echo test.json |  sed 's/. d:/' > newtest.json

한 줄만이 아니라 전체 파일에 대해 수행해야 합니다.

답변1

명령줄에서 json을 변환하는 데 많은 작업을 수행하고 있다면 jq 도구를 구하고 사용법을 배우는 것은 시간을 투자할 가치가 충분히 있습니다.

http://stedolan.github.io/jq/

위의 답변은 실제로 json을 구문 분석하지 않고도 최소한의 변환을 수행할 수 있음을 보여주지만 결국에는 정규식을 통해 버그가 있는 json 파서를 다시 만들거나 선택한 언어로 기본 json 파서를 사용하도록 되돌릴 것입니다.

jq는 빠르고 사용이 간편하며 도구 상자에 넣어두기 ​​매우 편리한 도구입니다.

BWT, 테스트 데이터가 잘못된 json이므로 위의 솔루션이 복잡해집니다. 그것을 고치면

{ "a":123 , "b": "sd", "c": "x45", "d": 1, "e": "" }
{ "a":5 , "b": "bfgg", "c": "x4c", "d": 31, "e": "" }

그러면 이 jq 명령은 당신이 원하는 것을 할 것입니다

 jq -c '{a,b,c}' test.json

{"a":123,"b":"sd","c":"x45"}
{"a":5,"b":"bfgg","c":"x4c"}

답변2

sed '/d:/s/, d:[^}]*/ /' test.json

전체 파일을 살펴보고 기호 까지 d:모든 부분을 포함하여 각 줄에서 제거합니다 ( 기호는 줄에 유지됩니다)., d:.*}}

답변3

@Rush의 답변은 sed이 문제를 해결하는 가장 좋은 방법일 가능성이 높지만 다음을 사용하여 이를 수행할 수 있는 방법 awk도 있습니다.

$ awk -F ', d.* ' '{print $1, $2}' file.txt 
{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

위의 내용은 awk데이터를 분할하는 데 사용됩니다 , d.*. 이는 2개의 데이터 필드를 생성하며, $1여기 $2에는 AWK의 문자열 분할로 인한 데이터가 포함됩니다.

답변4

다음과 같은 객체 세트를 포함하는 유효한 JSON 파일이 있다고 가정합니다.

{"a":123,"b":"sd","c":"x45","d":1,"e":"''"}
{"a":5,"b":"bfgg","c":"x4c","d":31,"e":"''"}

또는 이에 상응하는 것

{
  "a": 123,
  "b": "sd",
  "c": "x45",
  "d": 1,
  "e": "''"
}
{
  "a": 5,
  "b": "bfgg",
  "c": "x4c",
  "d": 31,
  "e": "''"
}

d각 개체에서 및 키를 제거하고 싶습니다 e.

를 사용하여 jq한 번에 하나의 키를 삭제합니다.

jq -c 'del(.d) | del(.e)' file.json

두 키를 동시에 삭제:

jq -c 'del(.d, .e)' file.json

둘 중 하나의 결과는 다음과 같습니다.

{"a":123,"b":"sd","c":"x45"}
{"a":5,"b":"bfgg","c":"x4c"}

실제 키를 이름으로 언급하지 않는 세 번째 방법은 를 사용하여 개체를 "항목" 목록으로 변환한 to_entries다음 마지막 두 항목을 삭제하고 목록을 다시 수정된 개체로 변환하는 것입니다.

jq -c 'to_entries | del(.[-2:]) | from_entries' file.json

이것은 질문의 텍스트가 제안하는 것과 가장 유사하며 결과는 객체의 키 순서에 따라 달라집니다.

관련 정보