input.txt
たとえば、次の文を含むテキストファイルがあります。
This is my base64 string: ${BASE64}
この変数があります。
myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
予想出力:
This is my base64 string: SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ==
このコマンドで作業を実行する必要があると思いましたが、エラーが発生しました。
$ sed -i -e "s/\${BASE64}/${myvar}/g" text.txt
sed: -e expression #1, char 70: unknown option to `s'
複数のオプションを試して数時間インターネットを検索しましたが、正確にはわかりません。私の考えではこれと関係があると思います。\
まず、何が間違っているのか知りたいです。次に、これを正しく実行する方法を知りたいです。私も適切なawkの例が好きです。
答え1
最大の問題はあなたが言ったことです:私の考えでは、それは/に関連しているようです。。 withを区切り文字として
使用するときは、/
使用する文字列に注意する必要があります。
したがって、sed
コマンドに別の区切り文字を使用する必要があります。
sed -i -e "s@\${BASE64}@${myvar}@g" text.txt
awkを使う
myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
awk -i inplace -v var='\\$\\{BASE64\\}' -v base="$myvar" '{sub(var,base);}1'
変数を置き換えるもう1つの方法はを使用することですenvsubst
。ファイルに変数が含まれている場合は、${BASE64}
同じ名前の変数を作成してファイルから置き換えることができます。しかし、変数をエクスポートする必要があります(一度だけ)実行する前にenvsubst
:
BASE64="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
export BASE64
#Not recommended:
envsubst < text.txt | tee text.txt
#Or
envsubst < text.txt > newtext.txt
mv newtext.txt text.txt
答え2
Perlを使用すると、環境変数から代替文字列を読み取ることができるため、コードに含める必要がないため、これを行うのが簡単になります。
repl=$myvar perl -i -pe 's/\${BASE64}/$ENV{repl}/' input.txt
(これは安全でなければならず、特別なシーケンスに対して評価されるべきではありません。)
答え3
使用幸せ(以前のPerl_6)
~$ env repl="SGVsbG8g_ETCETERA_==" raku -pe 's/\$\{BASE64\}/{ %*ENV<repl> }/' file.txt
#OR
~$ env repl="SGVsbG8g_ETCETERA_==" raku -pe 's/\$\{BASE64\}/%*ENV<repl>/' file.txt
入力例:
This is my base64 string: ${BASE64}
出力例(切り捨ておよび全長置換の使用も有効):
This is my base64 string: SGVsbG8g_ETCETERA_==
この答えは@ilkkachuのPerlの答えと非常によく似ています(ありがとう!)。変数env
のスペルは少し異なります。%*ENV
これはRakuの(動的)オペレーティングシステム環境変数を含むハッシュであり、<repl>
これを引用せずに単一のキーを呼び出すことができます。 2つのRakuの答えは中{ … }
かっこ挿入でのみ異なります。ソースコードについては、以下のNNTPスレッドを参照してください(ヒント#8)。
https://docs.raku.org/言語/variables#index-entry-$PERCENT_SIGN*ENV
https://www.nntp.perl.org/group/perl.perl6.users/2020/07/msg9004.html
https://raku.org