私は初めてシェルスクリプトとスクリプト作業に触れました。ここでhtmlレポートを生成し、このhtmlレポートの内容を送信されたjsonリクエストに追加する必要があります。次に、その要求を使用してAPIを呼び出します。
テンプレートとしてJsonリクエストがあり、テンプレートには、Base64を使用してエンコードした後に生成されたHTMLコンテンツを置き換える必要があるCONTENTというプレースホルダがあります。
AWKとsedを使用してテンプレートにエンコードされた文字列を追加しようとすると、Argument list is too longエラーが発生します。私が生成したHTMLファイルには40K行があるからです。
次の方法を使用すると、同じエラーが発生しました。
encStr="$(cat ./myreport.html | base64)"
#AWK-Approach
awk -v var="$encStr" '{gsub("CONTENT", var, $0); print}' /path/totemplate > output.tmp
#SED-Approach
sed -i "s|CONTENT|$encStr|" output.tmp
sedをedに変更し、コマンドを別のファイルに入れることをお勧めします。 ~によるとhttps://unix.stackexchange.com/a/284188/149867ただし、別の.shファイルを作成して現在のスクリプトに含めると機能しません。これは他の方法の詳細な例です。
答え1
CONTENT
独自の行にある場合は、代替エントリをファイルに入れて使用tmp
してください。
sed -e '/CONTENT/r tmp' -e '/CONTENT/d' inp
tmp
まず、一致する部分の後にファイルの内容を挿入し、その行を削除します。CONTENT
(コメントにある@philipposの答えは私にはうまくいきませんでした。一致後にファイルを挿入してから一致を削除する必要がありました)
答え2
すでに一時ファイルであるoutput.tmpを使用しています。
すべてをメモリに保存して変更しようとする代わりに(テンプレートを読み込んだ後、プレースホルダを置き換えるなど)
出力に必要な順序で一時ファイルに部品を書き込もうとします。
つまり、JSONリクエストテンプレートの最初の部分を生成した言語でoutput.tmpに作成します。
その後base64 ./myreport.html >> output.tmp
、内容を追加し、
次に、JSONリクエストテンプレートの残りの部分をoutput.tmpコンテンツに追加します。
交換は不要で、はるかに少ないメモリが必要です。これを達成するためにsedやawkは必要ありません。どちらもデータ操作のためのプログラミング言語なので、実際には何も操作する必要はありません。
また、不必要に猫を使用しないでください。ファイルをリンクするために使用されます。ファイルが読み取られたまま表示される既定の動作が悪用されます。ファイルを開くにはcatは必要ありません。 base64はSTDIN(パイプなど)から入力を読み取ることができるため、ファイルも読み取ることができます。
cat ./myreport.html | base64
もっとよく使うbase64 ./myreport.html