그래서 문자열이 포함된 파일이 있고 이를 다른 파일의 내용(또는 다른 명령의 출력)으로 바꾸고 싶습니다. 문제는 시간이 오래 걸리고 실패한다는 것입니다. 비록 짧지만 매우 잘 작동합니다.
내가 사용하는 명령은 이것이다
sed -i "s#\(var wasm = \)\".*\";#\\1\"`cat dist/camaro.wasm | hexdump -v -e '1/1 "%02X"'`\";#" dist/camaro.js
파일이 작을 때 camaro.wasm
작동합니다 . 그러나 크기가 크면 오류와 함께 명령이 실패합니다. argument list too long: sed
이 문제를 어떻게 해결할 수 있나요?
고쳐 쓰다:
camaro.js 콘텐츠
var camaro = (function() {
"use strict";
var wasm = "testtest";
})();
camaro.wasm 콘텐츠는 무엇이든 될 수 있습니다. 어떤 텍스트라도 가능합니다. testtest
파일 내용 camaro.wasm
이나 다른 명령 으로 바꾸고 싶습니다.
답변1
대체 문자열 에 16진수 덤프를 삽입하는 대신 s
파일로 읽어보세요.
{ printf ' %s' 'var wasm = "'; hexdump -v -e '1/1 "%02X"' camaro.wasm; } |
sed -e '/var wasm = ".*";/ {' -e 'r /dev/stdin' -e 'a\";' -e 'd;}' camaro.js
산출:
var camaro = (function() {
"use strict";
var wasm = "6C645950577A62776A57696452624E43... etc.";
})();
var wasm = ".*";
참고: 위의 내용은 stdin +의 내용과 일치하는 전체 줄을 대체합니다";
.s/match/replacement/
또한 일치하는 첫 번째 줄에서만 작동합니다. 이후 일치하는 줄은 모두 대체됩니다";
. 이러한 문제를 해결하려면awk
or를 사용하는 것을 고려하세요.perl
긴 문자열을 sed
스크립트의 일부로 사용하려면 sed
edit 명령을 스크립트 파일로 전달하십시오.
sed -f /dev/stdin camaro.js <<EOS
s#\(var wasm = "\).*";#\1$(hexdump -v -e '1/1 "%02X"' camaro.wasm)";#
EOS
- 명령 대체에서 생성된 잠재적으로 긴 문자열은
hexdump
편집 명령의 나머지 부분과 함께s
의 표준 입력 에 문자열로 전달됩니다. "매개변수 목록이 너무 깁니다" 오류를 방지하려면 sed에서 stdin을 스크립트 파일로 사용하도록 요구합니다.sed
-f /dev/stdin