如何将 IPv4 地址的最后一个八位字节携带到 sed 更改的部分?

如何将 IPv4 地址的最后一个八位字节携带到 sed 更改的部分?

我打算将我的网络从 64 个 IP 升级到 128 个 IP。当然,我不想在所有 40 多个虚拟机上手动更改它。我计划将 ansible ad-hoc 命令与 sed -i 一起使用,然后使用相同的命令重新启动接口。我已经尝试过了,但我发现了 - 谢谢你们 - 一个解决方案,如何替换地址中的斜杠,但我仍然需要将 IP 地址的最后一个八位字节作为变量携带到输出中。这在这里有效,但只是部分有效

原文:

address 195.23.154.X/26

我想要的是:

 address 195.34.154.X/25

/etc/network/interfaces/

我的部分工作 sed 命令带有转义斜杠:

 sed 's/address\ 195.24.153.3\/26/address\ 195.23.154.4\/27/g' interfaces.bak

如何保留此示例中的“3”?

答案1

只需将命令语法中的所有斜杠替换sed为不同的字符,并保留模式或替换中的斜杠,例如

sed 's#foo/bar#foo/baz#'

另一种选择是转义字符串中的所有斜杠

sed 's/foo\/bar/foo\/baz/'

答案2

假设你实际上需要显式匹配字符串address,后跟 IP 地址的前三部分,然后将子网掩码从 更新/26/25

sed 's|\(address 195\.23\.154\.[0-9]*\)/26|\1/25|'

首先,我用作命令|的分隔符s///。我这样做是为了避免必须逃避斜杠。任何单个字符都可以用作替换命令中的分隔符(除了少数明显的字符,例如换行符)。

然后,我使用捕获与地址中的斜杠匹配的字符串的第一部分\(...\)(请注意,我需要转义表达式中的点,以便能够仅匹配这些位置中的文字点)。然后,我可以使用反向引用将其插入\1命令的替换部分。

由于我还捕获了 IP 地址的最后一部分,天真地与 匹配[0-9]*,因此这将原封不动地转移到替换中。

测试:

$ echo 'address 195.23.154.112/26' | sed 's|\(address 195\.23\.154\.[0-9]*\)/26|\1/25|'
address 195.23.154.112/25

相关内容