파일을 읽고 변수에 저장하는 방법은 무엇입니까?

파일을 읽고 변수에 저장하는 방법은 무엇입니까?

파일에 데이터를 추가한 다음 사용합니다.

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.txtJSON이 아닌 일반 텍스트이므로 유효한 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.txttailsponge

또한 왜 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 개체를 얻었습니다.

작동하는 유일한 방법은 마지막 줄을 제외한 모든 줄 끝에 쉼표를 두는 것입니다.

이것이 완벽하고 올바른 접근 방식인지 확실하지 않습니다. 그러나 그것은 내 문제에 효과가 있었습니다.

관련 정보