sed는 매우 긴 파일 내용을 대체합니다.

sed는 매우 긴 파일 내용을 대체합니다.

그래서 문자열이 포함된 파일이 있고 이를 다른 파일의 내용(또는 다른 명령의 출력)으로 바꾸고 싶습니다. 문제는 시간이 오래 걸리고 실패한다는 것입니다. 비록 짧지만 매우 잘 작동합니다.

내가 사용하는 명령은 이것이다

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/또한 일치하는 첫 번째 줄에서만 작동합니다. 이후 일치하는 줄은 모두 대체됩니다 ";. 이러한 문제를 해결하려면 awkor를 사용하는 것을 고려하세요.perl

긴 문자열을 sed스크립트의 일부로 사용하려면 sededit 명령을 스크립트 파일로 전달하십시오.

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

관련 정보