そのため、文字列を含むファイルがあり、それを別のファイルの内容(または他のコマンドの出力)に置き換えたいと思います。問題は時間がかかり、失敗することです。短いですが、非常にうまく機能します。
私が使用するコマンドはこれです
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
代替文字列に16進ダンプを挿入するのではなく、ファイルとして読みます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
edit コマンドをスクリプトファイルに渡します。
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