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

おすすめ記事