내 파일을 아름답게 만들기 위해 jq를 사용할 수 있나요?

내 파일을 아름답게 만들기 위해 jq를 사용할 수 있나요?

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

spongeGNU(소프트웨어 패키지의 일부)와 같은 도구를 사용하여 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.jsonfile.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이제 내가 필요한 일을 하세요.

관련 정보