外部スクリプトファイルでsed - シェル変数を適用するには?

外部スクリプトファイルでsed - シェル変数を適用するには?

コマンドラインで直接動作する方法は次のとおりです。

$sed "s/a/X/;s/X/&a&/" file

シェル変数を使用する場合も同様です。

$varin=a ; varout=X ; sed "s/$varin/$varout/;s/$varout/&$varin&/" file

しかし、外部スクリプトファイルを使用すると、

$sed -f script.sed file

「ハードコードされた」アプローチのみが機能します。

$cat script.sed
s/a/X/
s/X/&a&/

シェル変数は拡張されませんが、

$cat script.sed
s/$varin/$varout/
a/$varout/&$varin&/

$varin=a ; varout=X ; sed -f script.sed file
#-> variables in script.sed not interpreted; output unchanged

外部スクリプトファイルでシェル変数の解釈を実装するにはsed

シェル変数自体を解釈できないことはよく知っていますがsed、一度実行した後に変数を解析するためにスクリプトを前処理(保存モードで)するにはどうすればよいですかbashsed最初にコマンドを使用してインポートできますか?

次の方法は生産的ではありません(使用bash)。

  • 使用export varin=a ; export varout=X
  • via sed -e $(cat sed.script) file:1行のスクリプトで動作し、最初の行にコメントがあっても複数行のスクリプトでは失敗します。
  • sed -f <(cat script.sed) file
  • eval sed -f script.sed file

答え1

envsubst実行する前に、スクリプトの変数を期待値に置き換えることができますsed

$ cat script.sed
s/$varin/$varout/
s/$varout/&$varin&/

文字列またはおよびまたは$varinin${varin}を対応する変数の値で置き換えます。$varout${varout}script.sed

$ varin='a' varout='X' envsubst '$varin $varout' <script.sed
s/a/X/
s/X/&a&/

sedプロセス置換を使用するコマンド:

sed -f <(varin='a' varout='X' envsubst '$varin $varout' <script.sed) file

答え2

Heredockが救出に来ます。

varin=a; varout=X
sed -f - <<_CODE_    file
s/$varin/$varout/
_CODE_

ただし、シェル変数が適切なクリーンアップなしで内部的にエアドロップされると、このアプローチはバグ/誤った結果でいっぱいです。たとえば、varoutに文字などが含まれている場合は&どうなりますか?/

関連情報