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

代替文字列に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/また、一致する最初の行でのみ機能します。その後、一致する行はすべて置き換えられます";。これらの問題を解決するには、awkorを使用することを検討してください。perl

長い文字列をsedスクリプトの一部として使用するには、sededit コマンドをスクリプトファイルに渡します。

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

おすすめ記事