将文件内容替换为机器当前的IP地址

将文件内容替换为机器当前的IP地址

我有一个 yaml 配置文件(cli.yaml)。有结构

database:
  host: "IP"

现在,我只想替换文件内容,或者更准确地说,IP用我的电脑的当前IPV4地址替换字符串。

由于我不太擅长终端,所以我将我的工作分为几个部分 -

例如:为了获取 IP:ipconfig getifaddr en0- 假设 IP 是 -10.0.0.1 现在我们知道这AWK可以帮助我们将文件内容替换为regrex.

因此,我尝试通过管道传输这两个命令,例如:ipconfig getifaddr en0 | awk '{print $1}'并且它有效。打印10.0.0.1

最后:ipconfig getifaddr en0 | awk '{sub(/IP/,$1)}1' cli.yaml > temp.txt && mv temp.txt cli.yaml

但我得到的输出是:

database:
  host: "host:"

这不是我的期望。现在,我想,有问题了PIPE。所以我用$1替换$0。但是,仍然没有达到预期的输出。

有什么提示吗?我做错了什么!!

答案1

您可以考虑使用yqjq用于更新值的包装器:

$ yq -Y --arg ip '10.0.0.1' '.database.host |= $ARGS.named.ip' cli.yaml
database:
  host: "10.0.0.1"

答案2

我找到了解决方案,但有点相反。我用的是REGEX代替字符串IP

awk -v ip="$(ipconfig getifaddr en0)" \
  '{sub(/((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/,ip)}1' \
  ./config/cli.yaml > temp.txt && mv temp.txt ./config/cli.yaml

相关内容