sed/awk/etcを使用してファイルの一部を標準入力のテキストに置き換えることはできますか?

sed/awk/etcを使用してファイルの一部を標準入力のテキストに置き換えることはできますか?

デフォルトでは、以下を実行する構成スクリプトがあります。

#!/bin/bash

source vars.sh

cat >foo.output <<EOF
# some static stuff (many lines...)
variable_bit=($SOME_VAR, $SOME_OTHER_VAR, ...)
# some more static stuff (many lines...)
EOF

foo.output.template次のような他のファイルを持つ方が良いでしょう。

# some static stuff (many lines...)
VARIABLE_BIT
# some more static stuff (many lines...)

私の設定スクリプトは次のことを行うことができます。

sed 's/VARIABLE_BIT/<<STDIN>>/' foo.output.template >foo.output <<EOF
variable_bit=($SOME_VAR, $SOME_OTHER_VAR, ...)
EOF

これはうまくいきません。これが可能かどうかはわかりませんが、sed目的は次のとおりです。

  • foo.output.templateを読む
  • マッチVARIABLE_BIT
  • 標準入力の他のものに置き換えてください。
  • 次に、foo.outputにパイプします。

sedawkまたはこれを簡単に実行できる他の一般的な* nixユーティリティはありますか?

答え1

少なくともGNUがある場合sed

$ cat foo.output.template
# some static stuff (many lines...)
VARIABLE_BIT
# some more static stuff (many lines...)

そして

$ cat bar
hello
hello

VARIABLE_BITその後、内容を一致させ、読み取り、挿入してbarから削除できますVARIABLE_BIT

$ cat bar | sed '/^VARIABLE_BIT/{
r /dev/stdin
d
}' foo.output.template
# some static stuff (many lines...)
hello
hello
# some more static stuff (many lines...)

dファイル名の一部として解釈されないように注意している場合は、それを1行のコードに置き換えることができます。

cat bar | sed -e '/^VARIABLE_BIT/{r /dev/stdin' -e 'd;}' foo.output.template

通常の方法で出力ファイルにリダイレクトします。つまり、> foo.output


cat bar注:本当に使用したい場合はstdinを説明します。文書代替テキストの場合は、これを直接実行できます。

sed -e '/^VARIABLE_BIT/{r bar' -e 'd;}' foo.output.template > foo.output

答え2

テンプレートを変数セクションの前と変数セクションの後に1つずつ2つのファイルに分割できませんか?その後、シェルは次のように接続できます。

( cat foo.output.template.before; cat ; cat foo.output.template.after; ) >foo.output

答え3

cat before.input - after.input >output <<EOF
whatever $FOO $BAR
EOF

関連情報