
このコマンドを実行しようとしています。
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
sedスクリプトにstdinから読み込むように指示します。
Linux(Linuxのみ)の複数のファイルに対して同じスクリプトを再利用するには、次の使用シェルを次のようにzsh
実行できます。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
ファイルを開くたびに最初からファイルが再び開きます。上記のコマンドは、他のシステム()またはパイピングを介してドキュメントを実装するシェルを使用してうまく機能しますが、/dev/stdin
十分な数のconf
ファイルに対してsed
一度だけ呼び出される場合にのみ可能です。 2 回目の呼び出しでは、with などの Linux/Cygwin 以外のシステムでは、最初の呼び出しで既に-f -
読み込ま/dev/stdin
れているため、空であるように見えます。
busybox
sed
-i
sed
また、GNUと同じ方法でサポートされていますが-f -
。-f /dev/stdin
FreeBSD の場合は、次を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
置き換えて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
。