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

不要将十六进制转储插入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脚本的一部分,请将编辑命令sed作为脚本文件传递:

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

相关内容