sed 替换为非常长的文件内容

Tua*_*ran 0 sed

所以我有一个带有字符串的文件,我想用另一个文件的内容(或另一个命令的输出)替换它。问题是它很长而且会失败。虽然它很短,但它工作正常。

我使用的命令是这样的

sed -i "s#\(var wasm = \)\".*\";#\\1\"`cat dist/camaro.wasm | hexdump -v -e '1/1 "%02X"'`\";#" dist/camaro.js
Run Code Online (Sandbox Code Playgroud)

camaro.wasm文件很小时,它可以工作。但是,如果它很大,则命令将失败并显示错误 argument list too long: sed

我将如何解决这个问题?

更新:

camaro.js 内容

var camaro = (function() {
    "use strict";

    var wasm = "testtest";

})();
Run Code Online (Sandbox Code Playgroud)

camaro.wasm 内容可以是任何内容。任何文字都可以。我想testtestcamaro.wasm文件内容或其他命令替换

gue*_*est 5

不要将 hexdump 插入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
Run Code Online (Sandbox Code Playgroud)

输出:

var camaro = (function() {
    "use strict";

    var wasm = "6C645950577A62776A57696452624E43... etc.";

})();
Run Code Online (Sandbox Code Playgroud)
  • 注意:以上内容替换了var wasm = ".*";与 stdin + 内容匹配的整行";——它不是s/match/replacement/. 此外,它仅适用于第一个匹配行 - 任何后续匹配行都被替换为";. 考虑使用awkperl如果您需要解决这些问题。

要将长字符串用作sed脚本的一部分,请将编辑命令sed作为脚本文件传递给:

sed -f /dev/stdin camaro.js <<EOS
    s#\(var wasm = "\).*";#\1$(hexdump -v -e '1/1 "%02X"' camaro.wasm)";#
EOS
Run Code Online (Sandbox Code Playgroud)
  • hexdump在命令替换中生成的可能很长的字符串作为字符串与s编辑命令的其余部分一起传递到sed; -f /dev/stdin要求 sed 使用 stdin 作为脚本文件,避免“参数列表太长”错误

  • @TuanAnhTran 很高兴为您提供帮助。刚想到使用脚本文件来解决这个问题 - 将其添加到答案中。 (2认同)