所以我有一个带有字符串的文件,我想用另一个文件的内容(或另一个命令的输出)替换它。问题是它很长而且会失败。虽然它很短,但它工作正常。
我使用的命令是这样的
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 内容可以是任何内容。任何文字都可以。我想testtest用camaro.wasm文件内容或其他命令替换
不要将 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/. 此外,它仅适用于第一个匹配行 - 任何后续匹配行都被替换为";. 考虑使用awk或perl如果您需要解决这些问题。要将长字符串用作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 作为脚本文件,避免“参数列表太长”错误| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |