저는 쉘 스크립팅과 스크립트 작업을 처음 접했습니다. 여기에서 html 보고서를 생성하고 이 html 보고서 콘텐츠를 제출된 json 요청에 추가해야 합니다. 그런 다음 해당 요청을 사용하여 API를 호출합니다.
템플릿으로 Json 요청이 있고 템플릿에는 Base64를 사용하여 인코딩한 후 생성된 HTML 콘텐츠를 바꿔야 하는 CONTENT라는 자리 표시자가 있습니다.
AWK 및 sed를 사용하여 템플릿에 인코딩된 문자열을 추가하려고 하면 Argument list is too long 오류가 발생합니다. 내가 생성한 HTML 파일에는 40K 줄이 있기 때문입니다.
다음 방법을 사용하면 동일한 오류가 발생했습니다.
encStr="$(cat ./myreport.html | base64)"
#AWK-Approach
awk -v var="$encStr" '{gsub("CONTENT", var, $0); print}' /path/totemplate > output.tmp
#SED-Approach
sed -i "s|CONTENT|$encStr|" output.tmp
sed를 ed로 변경하고 명령을 별도의 파일에 넣는 것이 좋습니다. ~에 따르면https://unix.stackexchange.com/a/284188/149867하지만 별도의 .sh 파일을 만들어 현재 스크립트에 포함시키면 작동하지 않습니다. 이 방법이나 다른 방법에 대한 자세한 예입니다.
답변1
CONTENT
자체 줄에 있으면 대체 항목을 파일에 넣고 사용 tmp
하십시오.
sed -e '/CONTENT/r tmp' -e '/CONTENT/d' inp
tmp
먼저 일치하는 부분 뒤에 파일 내용을 삽입한 다음 해당 줄을 삭제하세요.CONTENT
(댓글에 있는 @philippos의 답변이 제게는 효과가 없었습니다. 일치 후에 파일을 삽입한 다음 일치 항목을 제거해야 했습니다)
답변2
이미 임시 파일인 output.tmp를 사용하고 있습니다.
모든 것을 메모리에 저장한 다음 수정하려고 하는 대신(예: 템플릿을 읽은 다음 자리 표시자를 교체)
출력에 필요한 순서대로 임시 파일에 부품을 쓰려고 합니다.
즉, JSON 요청 템플릿의 첫 번째 부분을 생성한 언어로 output.tmp에 작성합니다.
그런 다음 base64 ./myreport.html >> output.tmp
내용을 추가하고,
그런 다음 JSON 요청 템플릿의 나머지 부분을 output.tmp 콘텐츠에 추가합니다.
교체가 필요하지 않으며 훨씬 적은 메모리가 필요합니다. 이를 달성하기 위해 sed나 awk가 필요하지 않습니다. 둘 다 데이터 조작을 위한 프로그래밍 언어이므로 실제로 아무것도 조작할 필요가 없습니다.
또한 불필요하게 고양이를 사용하지 마십시오. 파일을 연결하는 데 사용됩니다. 파일을 읽고 있는 그대로 표시하는 기본 동작으로 인해 남용됩니다. 파일을 열려면 cat이 필요하지 않습니다. base64는 STDIN(예: 파이프)에서 입력을 읽을 수 있으므로 파일도 읽을 수 있습니다.
cat ./myreport.html | base64
더 잘 쓰세요base64 ./myreport.html