コマンドラインで直接動作する方法は次のとおりです。
$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
、一度実行した後に変数を解析するためにスクリプトを前処理(保存モードで)するにはどうすればよいですかbash
?sed
最初にコマンドを使用してインポートできますか?
次の方法は生産的ではありません(使用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&/
文字列またはおよびまたは$varin
in${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に文字などが含まれている場合は&
どうなりますか?/