所以我有一个带有字符串的文件,我想用另一个文件的内容(或另一个命令的输出)替换它。问题是它很长而且会失败。虽然它很短,但它工作正常。
我使用的命令是这样的
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 作为脚本文件,避免“参数列表太长”错误