1

我有一个包含不同 IP 地址的文本文件。我需要编写一个脚本来找到带有IP的行(还有其他行)并将最后一位加1。这应该做50次!

这意味着将有 50 个新文件要保存。我不想使用逻辑转到行号并替换特定字符。

文件名也存在于文件中,应再次增加 1。我正在使用sed但无法实现正确的循环和选项。

输入文件是 example1:

 'name example101' 
'ip-address  10.255.255.13'
state enabled 
 'ip-address 10.255.253.45' 
'ip-address 10.255.255.13' 
'ip-address 10.0.0.130'

第一个新文件是 example102(最后一个是 example150):

 'name example102' 
'ip-address  10.255.255.14'
state enabled 
 'ip-address 10.255.253.46' 
'ip-address 10.255.255.14' 
'ip-address 10.0.0.131'
4

4 回答 4

2

要增加 IP,您可以使用此正则表达式:

perl -lpe 's/((\d{1,3}\.){3})(\d{1,3})/$1 . ($3 + 1)/eg' FILE

要增加“name example101”,您可以尝试使用类似的表达式。

于 2012-04-17T06:01:34.513 回答
0

使用忽略特定 ip?!

perl -lpe 's/((ip-address\s+(?!10\.255\.253\.45)((\d{1,3}\.){3}))(\d{1,3}))/$2.($5 + 1)/eg;s/(example)(\d{3})/$1.($2 + 1)/eg;' FILE

添加 ip(?!10\.255\.253\.45)部分忽略

更新:添加部分s/(example)(\d{3})/$1.($2 + 1)/eg;以增加输入字符串 example101 以使其成为 example102。

于 2012-04-17T14:26:40.727 回答
0

此命令行程序会递增除 IP 地址之外的所有数字(包括文件编号)10.0.0.130。如果要忽略的地址超过一两个,则此方法将变得笨拙,您应该执行一些操作,例如将所有不可变地址放入文件或__DATA__程序部分中。

perl -pe "s/(\d+)('\s*)$/($1+1).$2/e unless /\b\Q10.0.0.130\E\b/" ipfile

输出

 'name example102'
'ip-address  10.255.255.14'
state enabled
 'ip-address 10.255.253.46'
'ip-address 10.255.255.14'
'ip-address 10.0.0.130'

编辑

要为修改添加第二个排除项,此命令还可以保护0.0.0.0

perl -pe "s/(\d+)('\s*)$/($1+1).$2/e unless /\b\Q10.0.0.130\E|\Q0.0.0.0\E\b/" ipfile
于 2012-04-17T19:00:30.557 回答
0

我可以在 Vim 中以交互方式在几秒钟内完成此操作。在 Vim 中,Ctrl-A增加光标下的数字。搜索 IP 地址,转到最后一个八位字节,递增。在 register 下的键盘宏中录制a,调用 as @a,然后按住不放重复 N 次@@

以下是确切的击键:

开始录制:

qa

搜索下一个 IPv4 地址的开始:

 /\([0-9]\+\.\)\{3\}[0-9]\+[Enter]

在最后一个八位字节之前跳转到点(向前到点 3 次):

 3f.

增量:

 Ctrl-A

完成录制:

 q

现在,再次运行宏:

 @a

重复(按住@键自动重复):

 @@

如果注意到您编辑了一个您不应该使用u多次撤消的 IP,请跳过它,然后从那里开始。

于 2012-04-17T15:36:01.110 回答