首页 > 解决方案 > 用 Bash 替换文件中不同格式的 IP 地址?

问题描述

上下文: 我有几个.properties文件,其中包含以下形式的 IP 地址:

    advertised.listeners=PLAINTEXT://ip-68-51-0-82.ec2.internal:9092
    advertised.host.name=ip-68-51-0-82.ec2.internal

(为了匿名,IP 地址已随机化)

理论上的解决方案:我试图用 bash 脚本.properties中的 bash 命令的结果自动替换文件中提到的 IP 地址hostname -i(而不是在 VIM 中手动编辑 IP)。

问题: hostname -i返回我需要的 IP 地址,但格式不同。它返回62.57.0.85的是点表示法而不是破折号表示法。

目标:将文件的文本更改为现在读取:

advertised.listeners=PLAINTEXT://ip-62-57-0-85.ec2.internal:9092
advertised.host.name=ip-62-57-0-85.ec2.internal

我该怎么做?我会使用类似的东西sed吗?

更新(2021 年 7 月 6 日,19:06):查看答案并确定问题的进一步限制后,以下是对我有用的代码:

sed -i "s|68-51-0-82|$(hostname -i | tr . -)|g" server.properties

更详细地说,我能够对我希望替换的 IP 进行硬编码,因为我知道它总是相同的。如果您不这样做,并且需要针对任何潜在的 IP 地址进行模式匹配,请参阅此问题的原始答案。

至于 的使用tr,将主机名的格式(默认为点表示法)转换为破折号表示法是一种快速简便的方法。然后我通过变量tr直接在命令中使用命令的输出sed$

标签: bashamazon-web-servicesamazon-ec2replaceip

解决方案


根据 OP 的进一步评论/澄清更新:

$ oldip='68-51-0-82'                        # OP knows in advance the IP that needs to be replaced in the file
$ newip='62-57-0-85'                        # OP has already swapped out periods for hyphens
$ sed "s/${oldip}/${newip}/g" .properties
advertised.listeners=PLAINTEXT://ip-62-57-0-85.ec2.internal:9092
advertised.host.name=ip-62-57-0-85.ec2.internal

如果 OP 知道oldip始终相同(即68-51-0-82),那么可以将其硬编码到sed调用中,如下所示:

$ sed "s/68-51-0-82/${newip}/g" .properties
advertised.listeners=PLAINTEXT://ip-62-57-0-85.ec2.internal:9092
advertised.host.name=ip-62-57-0-85.ec2.internal


假设:

  • 在我的虚拟机上hostname -i==> fe80::5454:7ccf:aa17:f765%13 10.8.1.6 192.168.1.4...所以我假设 OP 已经将新的 IP 地址解析为一个变量(例如,newip
  • 文件中的所有 IP 地址都与 OP 发布的格式相匹配,即<stuff>.ip-n1-n2-n3-n4.<stuff>

一个想法使用sed

$ cat .properties
advertised.listeners=PLAINTEXT://ip-68-51-0-82.ec2.internal:9092
advertised.host.name=ip-68-51-0-82.ec2.internal

$ newip='62.57.0.85'

$ sed "s/ip-[^\.]+\./ip-${newip//./-}\./" .properties
advertised.listeners=PLAINTEXT://ip-62-57-0-85.ec2.internal:9092
advertised.host.name=ip-62-57-0-85.ec2.internal

在哪里:

  • ip-[^\.]+\.- 匹配字符串ip-+<everything that's not a period>文字句点 ( .)
  • ip-${newip//./-}\.- 替换为字符串ip-+ 我们的变量(句点替换为连字符)+ 文字句点 ( .)

如果 OP 正在寻找覆盖.properties,并且已验证此sed命令执行预期的操作,则-i可以添加标志以告知sed覆盖输入文件(即.properties)。


推荐阅读