sedコマンドを使用して長い文字列を置き換える:パラメータリストが誤りすぎるエラー

sedコマンドを使用して長い文字列を置き換える:パラメータリストが誤りすぎるエラー

このコマンドを実行しようとしています。

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 -sedsedスクリプトにstdinから読み込むように指示します。

Linux(Linuxのみ)の複数のファイルに対して同じスクリプトを再利用するには、次の使用シェルを次のようにzsh実行できます。kshbashdashyashbashsed

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-isedまた、GNUと同じ方法でサポートされていますが-f --f /dev/stdinFreeBSD の場合は、次を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検索し、その行の後に内容を挿入し、最初の行に戻り、文字列を含む行を再検索して削除するのに役立ちます。このコマンドは変更されたファイルを保存します。FILENAMEBASE64base64.txtBASE64wed

答え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合計項目を置き換えます。pat2g
  • wディスクへの変更の書き込み
  • q終了(とにかくEOFを受け取ると発生します)

もちろん、sedコマンドをファイルに入れて使用することもできますが、そうしてファイルをその場で変更したい場合は、一時ファイルを作成して移動するよりも-f使用する方が良いでしょう。edsed -i

答え4

最終的にsed指示をファイルに入れました。

SEDCOMMANDS=`tempfile`

そして電話してください

sed -f "$SEDCOMMANDS" -- "$FILE_NAME"

無視しても大丈夫ですsed -i。ファイルをその場で編集するには:https://unix.stackexchange.com/a/284188/149867そのedコマンドをファイルに入れてから、とwを入力しますq

関連情報