このコマンドを実行しようとしています
sed -i -e "s/BASE_64/$BASE_64/" FILE_NAME
ここで、は$BASE_64
ファイル コンテンツの Base 64 表現です。
sed
文字列が長すぎるためエラーが発生します。
引数リストが長すぎます
このエラーを回避するにはどうすればよいでしょうか?
答え1
常に次の操作を実行できます (sed
すでに GNU ( -i
) を使用している場合):
sed -i -f - FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF
-f -
sed
stdin から sed スクリプトを読み込むように指示します。
Linux (Linux のみ) 上で、 のようなシェルと、一時zsh
ファイルを使用してヒアドキュメントを実装するバージョン 5.0 まで (比較的小さなヒアドキュメントの場合はや(または5.1+)のようなパイプではなく)、GNU を使用し、複数のファイルに同じスクリプトを再利用したい場合は、次のようにします。ksh
bash
dash
yash
bash
sed
find . -name '*.conf' -exec sed -i -f /dev/stdin {} + << EOF
s/BASE_64/$BASE_64/g
EOF
Linux(LinuxとCygwinのみ)では/dev/stdin
、標準入力と同じように-
機能します。代わりに、これは標準入力で開いているファイルへのシンボリックリンクなので、 がsed
ファイルを開くたびに、ファイルが最初から新しく開かれます。上記のコマンドは、他のシステム ( がある) や、パイプでヒアドキュメントを実装するシェルでも問題なく機能しますが、ファイルが1 回だけ呼び出される/dev/stdin
場合に限られます。 の場合と同様に、Linux/Cygwin 以外のシステムで 2 回目に呼び出されると、最初の呼び出しで既に読み込まれているため、空として表示されます。conf
sed
-f -
/dev/stdin
busybox
sed
も-i
GNU と同じようにサポートしsed
ていますが、 はサポートしていません。したがって、いずれにしても-f -
を使用する必要があります。FreeBSD では、次のように使用します。-f /dev/stdin
sed
sed -i '' -f /dev/stdin FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF
答え2
まず、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
答え3
sed
もう 1 つのオプションは、コマンドを に置き換えてファイルに保存することです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
終了する(いずれにせよ EOF を取得したときに発生します)
もちろん、sed
コマンドをファイルに入れて を使用すること-f
もできますが、その場合、ファイルをその場で変更したいときは、ed
のように一時ファイルを作成して移動する代わりにを使用する方がよいでしょうsed -i
。
答え4
sed
私は指示をファイルにまとめました
SEDCOMMANDS=`tempfile`
そして呼ばれる
sed -f "$SEDCOMMANDS" -- "$FILE_NAME"
を使わない場合はこれで問題ありませんsed -i
。ファイルをその場で編集したい場合は、https://unix.stackexchange.com/a/284188/149867同等のed
命令をファイルに入れて、その後にw
と を続けますq
。