我有一个 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