所以我有一个带有字符串的文件,我想用另一个文件的内容(或另一个命令的输出)替换它。问题是它很长而且会失败。虽然它很短,但它工作得很好。
我使用的命令是这样的
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/
.此外,它仅适用于第一个匹配行 - 任何后续匹配行都将替换为";
.如果您需要解决这些问题,请考虑使用awk
or 。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