jq를 사용하여 json 파일을 읽고 파일의 예쁜 버전을 작성하는 쉘 스크립트를 작성했습니다.
cat input.json | jq . > pretty.json
cp pretty.json ./input.json
rm pretty.json
2행과 3행이 필요한 이유는 다음과 같습니다.
cat input.json | jq . > input.json
파일을 비워두면 임시 파일을 사용하지 않고 shell/jq를 사용하여 파일을 아름답게 만드는 방법이 있습니까?
답변1
jq
아니요, 파일을 처리 하고 결과를 원시 파일로 출력 할 수 없습니다 .
다음과 같이 임시 파일을 사용할 수 있습니다.
cp file.json file.json.tmp &&
jq . file.json.tmp >file.json &&
rm file.json.tmp
이 일련의 작업은 원본 파일의 메타데이터도 보존합니다. 각 단계는 이전 단계의 성공적인 완료 여부에 따라 달라지므로 &&
예를 들어 실행이 실패하더라도 문서가 손실되지 않습니다.jq
sponge
GNU(소프트웨어 패키지의 일부)와 같은 도구를 사용하여 moreutils
임시 파일을 처리하는 수작업을 숨길 수 있습니다.
jq . file.json | sponge file.json
이는 여전히 배후에서 임시 파일을 사용한다는 점에 유의하세요.
두 가지 변형 중에서 jq
파티션이 갑자기 가득 차거나 제대로 실행되지 않는 경우(입력 문서의 가용성 또는 오류로 인해) 세 가지 명령 중 첫 번째 세트만 데이터 손실을 방지할 수 있습니다.
답변2
json-beautify-inplace () {
temp=$(mktemp)
printf 'input = %s\n' "$1"
printf 'temp = %s\n' "$temp"
cp -- "$1" "$temp"
jq . "$temp" > "$1"
}
json-uglify-inplace () {
temp=$(mktemp)
printf 'input = %s\n' "$1"
printf 'temp = %s\n' "$temp"
cp -- "$1" "$temp"
jq -r tostring "$temp" > "$1"
}
답변3
file.json
임시 파일을 사용하지 않고도 파일을 복사본으로 바꾸고 아름답게 만드는 것이 실제로 가능 jq
하지만 이는 약간의 해킹입니다.
( exec < file.json; rm file.json; jq . > file.json )
이 명령줄의 "마법"에 대한 설명은 다음과 같습니다.
exec < file.json
file.json
전체 쉘에 대한 표준 입력으로 원본 파일을 열 므로 후속 명령은 이 파일을 표준 입력으로 사용합니다.rm file.json
들어오는 명령으로 내용을 덮어쓰지 않고 파일이 열려 있는 동안 내용을 계속 사용할 수 있도록 파일 링크를 해제합니다.jq . > file.json
표준 입력에서 새file.json
파일로 JSON을 아름답게 만듭니다.- 전체 명령줄은 서브쉘에서 실행되도록 괄호로 묶어서 삭제된 파일은 닫히고 표준 입력은 마지막에 복원됩니다.
약간 더 간결한 방법으로 작성할 수 있습니다.
( rm file.json; jq . > file.json ) < file.json
아무튼 이 작업보다는 임시 파일을 사용하는 걸 추천드려요!
답변4
jq
나는 그렇게 할 수 없었기 때문에 .bashrc
이 쉘 함수를 and 에 정의했습니다 .zshrc
.
prettify() {
local temp_file
temp_file=$(mktemp) &&
jq . < "$1" > "$temp_file" &&
mv -- "$temp_file" "$1"
}
prettify foo.json
이제 내가 필요한 일을 하세요.