このコマンドを実行しようとしています
sed -i -e "s/BASE_64/$BASE_64/" FILE_NAME
どこ $BASE_64
は、ファイルコンテンツのbase 64表現です。
sed
は、文字列が長すぎるためエラーになります。
引数リストが長すぎます
このエラーを回避するにはどうすればよいですか?
最初に、base64でエンコードされたデータをbase64.txt
などのファイルに保存します。
例えば:
base64 < originalfile > base64.txt
次に:
printf '%s\n' '/BASE64/r base64.txt' 1 '/BASE64/d' w | ed FILENAME
これはed
を使用してFILENAME
で文字列BASE64
を含む行を検索し、その行の後にbase64.txt
の内容を挿入して、最初の行に戻ります。文字列BASE64
の行をもう一度検索して削除します。 w
のed
コマンドは、変更されたファイルを保存します。
あなたはいつでもできます(GNU sed
をすでに使用しているため(-i
)):
sed -i -f - FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF
-f -
は、sed
にstdinからsedスクリプトを読み取るように指示します。
Linux(およびLinuxのみ)で、bash
、zsh
、ksh
のようなシェルを使用して複数のファイルに同じスクリプトを再利用する場合は、ここに一時的なドキュメントを実装しますファイル(dash
やyash
のようなパイプとは対照的に)とGNU sed
を使用して、次のことができます:
find . -name '*.conf' -exec sed -i -f /dev/stdin {} + << EOF
s/BASE_64/$BASE_64/g
EOF
Linux(およびLinuxのみ)では、/dev/stdin
は-
と同じようにstdinを意味しません。代わりに、stdinで開いているファイルへのシンボリックリンクであるため、sed
がファイルを開くたびに、最初からファイルを開きます。上記のコマンドは、他のシステム(/dev/stdin
があるシステム)またはパイプを使用してヒアドキュメントを実装するシェルで正常に機能しますが、conf
ファイルが十分に少なく、sed
が1回だけ呼び出される場合に限ります。 -f -
のようなLinux以外のシステムで2回目に呼び出された場合、/dev/stdin
は最初の呼び出しですでに読み取られているため、空に表示されます。
busybox
sed
もGNU sed
と同じ方法で-i
をサポートしていますが、-f -
はサポートしていません。したがって、いずれの場合も-f /dev/stdin
を使用してください。FreeBSDsed
では、次のように使用します。
sed -i '' -f /dev/stdin FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF
別のオプションは、sed
をed
で置き換え、コマンドをファイルに保存することです。たとえば、次の内容でed_cmds
を作成するとします。
%s/BASE_64/<expanded variable>/g
w
q
その後、実行できます
< ed_cmds ed FILE_NAME
必要な変更が加えられるため、$BASE_64
を設定する代わりに、edコマンドファイルを作成します。
編集内容
%
は、ファイルの各行にコマンドを適用することを意味しますs/pat1/pat2/g
は、最後にpat1
の出現箇所をpat2
およびg
で置き換え、最初の一致だけでなく、すべての一致に対して実行しますw
変更をディスクに書き込むq
quit(とにかくEOFを取得したときに発生します)もちろん、sed
コマンドをファイルに入れて-f
を使用することもできますが、それを行っていてファイルを適切に変更したい場合は、一時ファイルを作成する代わりにed
を使用することもできます。 sed -i
と同じように移動します。
ファイル($ BASE_64)のBase64表現のサイズが長すぎ、最大引数サイズを超えています。実行すると、システムのこの制限を確認できるはずです
getconf ARG_MAX
ARG_MAX
値のサイズを増やす必要があります。しかし、ファイルが大きすぎる場合は、この置換を行うために別のアプローチを使用する必要があると思います。 Pythonスクリプトがそれをやってくれるなら、私もそれを試してみます。
sed
命令をファイルに入れてしまいました
SEDCOMMANDS=`tempfile`
そして呼ばれた
sed -f "$SEDCOMMANDS" -- "$FILE_NAME"
sed -i
を使用しない場合に適しています。ファイルをその場で編集する場合は、 https://unix.stackexchange.com/a/284188/149867 に従い、同等のed
指示をファイルに入れて、 w
およびq
。