我打算将我的网络从 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