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.*
. 이는 AWK가 문자열을 분할하여 생성된 데이터를 $1
포함하는 2개의 데이터 필드를 생성합니다.$2
답변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
이는 질문 텍스트에서 묻는 내용과 가장 유사하며, 결과는 개체의 키 순서에 따라 달라집니다.