我可以使用 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如果您小心避免被解释为文件名的一部分,则可以将其变成单行代码

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

相关内容