jq
숫자를 문자열로 변환하거나 문자열을 연결하는 기능이 내장되어 있습니다. 패딩(%4s)
과 유사하게 jq에서 문자열 형식을 지정하는 방법입니다 .printf
예를 들어, 숫자를 왼쪽 정렬하고 10자의 공백을 차지하도록 하려면 어떻게 해야 할까요?
echo '{"title" : "A sample name", "number" : 1214}' | jq '(.title) + " " + (.number | tostring)'
답변1
jq
인용된 문자열 내에서 표현식을 사용할 수 있습니다.\(foo)
문자열 내에서 백슬래시 뒤의 괄호 안에 표현식을 넣을 수 있습니다. 표현식이 반환하는 모든 내용이 문자열에 삽입됩니다.
jq '"The input was \(.), which is one less than \(.+1)"' <<< 42
결과:
"The input was 42, which is one less than 43"
답변2
한 가지 접근 방식은 셸에서 이 작업을 수행하는 것이 아니라 출력 셸 문을 jq
사용하여 jq
셸에서 수행하는 것입니다.
eval "$(
jq -r -n '
{ "title": "A sample name", "number": 1214 } |
[ "printf", "%s %10s\\n", .title, .number ] | @sh'
)"
또는,
eval "$(
printf '%s\n' '{ "title": "A sample name", "number": 1214 }' |
jq -r '[ "printf", "%s %10d\\n", .title, .number ] | @sh'
)"
또는,
printf '%s\n' '{ "title": "A sample name", "number": 1214 }' |
{
eval "$(
jq -r '[ "printf", "%s %10s\\n", .title, .number ] | @sh'
)"
}
이 jq
명령은 다음을 출력합니다.
'printf' '%s %10d\n' 'A sample name' 1214
연산자를 사용하면 @sh
명령의 모든 부분을 정확하게 인용할 수 있습니다. 평가되면 다음이 출력됩니다.
A sample name 1214
비슷한 접근 방식이지만 값을 할당할 수 있는 두 가지 변수를 제공합니다.
jq -r -n '
{ "title": "A sample name", "number": 1214 } |
@sh "title=\(.title)",
@sh "number=\(.number)"'
그런 다음 스크립트에서 다음 변수를 사용할 수 있습니다.
unset -v title number
eval "$(
jq -r -n '
{ "title": "A sample name", "number": 1214 } |
@sh "title=\(.title)",
@sh "number=\(.number)"'
)"
printf '%s %10s\n' "$title" "$number"
알려진 데이터의 경우좋아요(예를 들어 제목에는 개행 문자를 포함할 수 없습니다.) 다음을 수행할 수 있습니다.
jq -r -n '
{ "title": "A sample name", "number": 1214 } |
[ .title, .number ] | @sh' |
xargs printf '%s %10s\n'
printf
즉, 데이터를 셸에 전달하기 전에 데이터가 인용되어 있는지 확인하세요.외부유틸리티 printf
, 내장 쉘이 아님).
답변3
jq
를 포함하지 마십시오 printf
. 한 가지 접근 방식은 다음과 같습니다.여기 에서 가져온 부분:
echo '{"title" : "A sample name", "number" : 1214}' |
jq '(.title) + " " +
(.number | tostring | (" " * (10 - length)) + .)'
어쩌면 모듈로 추가하는 것이 더 나을 수도 있습니다.
개인적으로 저는 jq
약간 혼란스러운 코드 줄을 빨리 발견하고 Perl, Python, PHP 또는 유사한 언어에 의존합니다.기본 이상의 일을 한다면.(그게 바로 나야 :P)
예를 들어, PHP를 사용하면:
#! /usr/bin/env php
<?php
$data = json_decode(file_get_contents("php://stdin"));
printf("%s: %10d\n", $data->title, $data->number);
?>
(물론 오류 검사 등도 추가될 예정입니다.)