
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 도구를 구하고 사용법을 배우는 것은 시간을 투자할 가치가 충분히 있습니다.
위의 답변은 실제로 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
이것은 질문의 텍스트가 제안하는 것과 가장 유사하며 결과는 객체의 키 순서에 따라 달라집니다.