bash - 用 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
$
解决方案
根据 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
)。
推荐阅读
- python-3.x - Python 版本和 BQ API 兼容性
- excel - 从函数调用时 Excel 宏不起作用
- bash - 带有 bash gcloud 身份令牌、heredoc 和 printf 的 kubectl 补丁秘密
- php - Laravel 时间戳记录谁做了某些动作(比如 created_at & created_by, updated_at & updated_by)
- java - 在 android (Java 8) 上运行 TensorFlow Lite 时出现 java.lang.NoSuchMethodError
- laravel - 在 Laravel 中存储每条记录的图像的方法?
- django - 使用 vue-recaptcha 和 Django Rest Framework 中间件的 CSRF 令牌丢失错误
- python - 如果不是现有值,则合并应采用 Nan 值
- javascript - 如何在 Vue 3 的组合 API 中正确共享 onMounted 钩子上设置的反应变量?
- firebase - Flutter:如何删除 Provider not found & Invalid Qualifier 错误