我有一个配置脚本,它基本上执行以下操作:
#!/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
sed
、awk
或其他一些常见的 *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
如果您小心避免被解释为文件名的一部分,则可以将其变成单行代码
cat bar | sed -e '/^VARIABLE_BIT/{r /dev/stdin' -e 'd;}' foo.output.template
以通常的方式重定向到输出文件,即> foo.output
注意:我cat bar
只是为了说明标准输入;如果你真的想使用文件对于替换文本,那么你可以直接这样做,即
sed -e '/^VARIABLE_BIT/{r bar' -e 'd;}' foo.output.template > foo.output
答案2
您不能将模板分成两个文件,一个在变量部分之前,一个在变量部分之后吗?然后 shell 可以像这样连接它们:
( 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