파일에 데이터를 추가한 다음 사용합니다.
echo "$(tail -n10 newdata.txt)" > newdata.txt;
파일에는 10줄만 남습니다 newdata.txt
.
이 파일을 읽고 모든 내용을 변수에 저장하여 실행할 때
{"Value":" "} | jq .
JSON 파일을 만듭니다. 하나의 키에 10개의 값을 모두 쓸 수 있게 됩니다 value
.
나는 노력했다
value=cat newdata.txt
하지만 이로 인해 구문 분석 오류가 발생합니다.
Invalid string: control characters from U+0000 through U+001F must be escaped.
답변1
이것은 하나입니다XY 문제. 파일의 내용을 newdata.txt
변수에 할당하려면 lines
다음을 사용하세요.
lines="$(cat newdata.txt)"
newdata.txt
그런데 왜 변수에 내용을 할당합니까 ?
예상되는 결과는 필드에 값이 value
포함된 JSON 개체입니다 newdata.txt
. 의 내용은 newdata.txt
JSON이 아닌 일반 텍스트이므로 유효한 JSON을 읽어야 하므로 echo {"value", $(cat newdata.txt)}
또는 이에 상응하는 기능이 작동 {"value", $lines}
하지 jq .
않습니다 .jq
실제 질문은 다음과 같습니다.일반 텍스트 줄을 JSON으로 변환하는 방법은 무엇입니까?
jq
옵션을 사용하여 모든 입력 행을 JSON 문자열 스트림으로 구문 분석할 수 있습니다 -R
. --raw-input
모든 입력 라인을 한 번에 구문 분석하려면 옵션 -s
, 을 사용하십시오 --slurp
. 그런 다음 입력을 일반 jq
스트림 처리 에 사용할 수 있으므로 다음과 같습니다.
jq -sR '{"value", .}' newdata.txt
필요한 JSON 객체를 제공합니다.
반면에 echo "$(tail -n10 newdata.txt)" > newdata.txt
간헐적으로 실패할 수밖에 없습니다. 마지막 10줄을 읽기 전에 0바이트로 >newdata.txt
잘릴 가능성이 높습니다 . 이를 사용하여 이 문제를 해결할 수 있지만 아래를 참조하십시오.newdata.txt
tail
sponge
또한 왜 echo
? tail -n 10
이미 stdout에 에코되었으므로 출력을 문자열로 캡처할 필요가 없으며 echo
다시 stdout에 에코하면 됩니다.
이 모든 것을 결합하면 한 줄의 솔루션은 다음과 같습니다.
tail -n 10 olddata.txt | tee newdata.txt | jq -sR '{"value", .}' &&
mv newdata.txt olddata.txt
bash
변수, 문자열 등 다른 프로그래밍 언어의 모든 기능을 갖추고 있지만 stdin에서 읽고 stdout에 쓰는 스트림 프로세서로 생각하는 것이 더 효율적입니다.
답변2
노력하다:
value=$(perl -e 'print qx/cat newdata.txt/;')
이것은 "-e"를 사용하여 컴파일러에 의해 실행될 Perl 코드를 정의할 수 있도록 합니다.
$()를 사용하면 명령의 출력을 캡처하여 이를 쉘 변수에 할당할 수 있습니다.
답변3
나는 그것에 대해 생각했다. 혹시 필요하신 분들을 위해 답변을 올려드립니다. 다음과 같이 newdata.txt라는 파일에 데이터를 추가합니다.echo "$(tail -n10 newdata.txt)" > newdata.txt;
그런 다음 파일을 value: value="$(cat newdata.txt)"라는 변수에 복사했습니다.
완료되면 echo "{\"Values\":[$value]}" | jq .
JSON 개체를 얻었습니다.
작동하는 유일한 방법은 마지막 줄을 제외한 모든 줄 끝에 쉼표를 두는 것입니다.
이것이 완벽하고 올바른 접근 방식인지 확실하지 않습니다. 그러나 그것은 내 문제에 효과가 있었습니다.