나는 이것을 큰 중첩 파일을 구문 분석하는 효율적인 방법 jq
으로 사용합니다. 때로는 다음과 같이 키와 값을 큰따옴표 대신 작은따옴표로 묶은 형식의 파일이 필요 json
합니다 .jq
json
{
'aggs': {
'two': {
'composite': {
'size': 700
}
}
}
}
이것이 실제 형식으로 간주되지 않는다는 것을 알고 있지만 json
jq에 이 파일을 읽기 위해 설정할 수 있는 매개변수가 있는지 궁금합니다. 그렇지 않으면 이 파일을 읽을 수 없습니다.
그렇지 않다면 리눅스에서 모든 작은 따옴표를 큰 따옴표로 바꾸어 읽을 수 있도록 하는 가장 효율적인 방법은 무엇입니까?jq
답변1
일반적으로 키나 문자열에 작은따옴표를 사용하는 것은 파괴적입니다.JSON 형식 사양, 그러나 우리는 문서를 리터럴(작은따옴표로 묶은) 문자열을 포함하는 YAML 문서로 해석할 수 있습니다.
마이크 파라yq
이를 YAML(아래 언급된 주의사항 포함)로 구문 분석하고 표준 JSON으로 변환할 수 있습니다.
$ yq -oj eval . file
{
"aggs": {
"two": {
"composite": {
"size": 700
}
}
}
}
'1"2'
올바르게 변환 되지만 "1\"2"
처리되지는 않습니다 '1\'2'
(오류가 발생하지만 해당 문자열은 YAML에서도 유효하지 않은 문자열이므로 이는 놀라운 일이 아닙니다). 백슬래시는 작은따옴표로 묶인 YAML 문자열에서 '1\"2'
리터럴 이므로 "1\\\"2"
.
\n
백슬래시는 리터럴 백슬래시이므로 다른 인코딩된 값이 포함된 문자열(예: 로 인코딩된 리터럴 개행 또는 로 인코딩된 리터럴 탭) 에서는 원하는 작업을 수행하지 못할 수 있습니다. 평화 \t
를 위해 별도로 변환하세요 .\\n
\\t
안드레이 키슬류크yq
(이것은 의 래퍼입니다 jq
) Mike의 것과 동일한 제한 사항과 주의 사항이 있는 것 같습니다 yq
.
$ yq . file
{
"aggs": {
"two": {
"composite": {
"size": 700
}
}
}
}
스티븐 레빈의yj
, YAML에서 JSON으로 데이터를 변환하는 데에도 사용할 수 있습니다.
$ yj <file
{"aggs":{"two":{"composite":{"size":700}}}}
답변2
이러한 파일에서 json처럼 따옴표가 이스케이프(접두사)된 경우 \
문서를 제공하기 전에 따옴표를 다음으로 번역할 수 있습니다.tr
jq
cat file_with_single_quotes | tr "'" '"' | jq ...
아니면 더 간단합니다:
tr "'" '"' < file_with_single_quotes | jq ...
질문의 텍스트:
$ tr "'" '"' < file_sq | jq .aggs.two
{
"composite": {
"size": 700
}
}