将命令的结果传递给 SED

passing the result of a command to SED

我想执行以下操作,获取我的服务器的主机 IP,然后使用此值替换配置文件中的虚拟值。

对于获取服务器 ip 的第 1 步,我调用:

hostname -I | head -n1 | awk '{print ;}'

对于第 2 步替换文件中的虚拟值,我会这样做:

sed -i 's/dummyvalue/valuefromprevioushostnamecommand/g' filename.

我们的想法是在不使用任何 shell 脚本的情况下将这些步骤合并到一个 unix 命令中。

如有任何帮助,我们将不胜感激 罗布

您就快完成了 - 只需将两个命令嵌套在一起即可:

sed -i s/'dummyvalue'/$(hostname -I | head -n1 | awk '{print ;}')/g filename

请注意,您需要删除 s///g 周围的单引号,并将它们放在 dummyvalue 周围。否则 bash 不会尝试解释内部命令。

使用 awk 时不需要管道命令链。只需在一个 awk 命令中完成。您没有显示任何样本输入和预期输出,因此这显然未经测试,但即使不完全符合您的需要,也会接近您的需要:

hostname -I |
awk -i inplace 'NR==FNR{if (FNR==1) val=; nextfile} {gsub(/dummyvalue/,val)} 1' - filename

以上使用 gawk 4.* 用于 -i inplacenextfile,其他 awks 只做:

hostname -I |
awk 'NR==FNR{if (FNR==1) val=; next} {gsub(/dummyvalue/,val)} 1' - filename > tmp && mv tmp filename