使用sed替换单个记录

时间:2015-06-08 09:01:14

标签: regex awk sed

我正在自动创建安全策略,我有下面的记录,包括source / dst IP,src / dst / zone,策略名称和端口。 我可以轻松地移动记录并使用awk在它们之间插入文本,但是当我需要修改单个记录并保持其余部分相同时,我会陷入困境。 如下所示,在第3条记录中,我需要替换“。”用“ - ”和“/”用“ - ”表示“。”政策名称中不支持“/”。

net-10.1.24.0/23  net-10.20.0.0/27  net-10.1.24.0/23_net-10.20.0.0/27   vpn-zone    internal-zone-servers   udp-123
net-10.1.24.0/23  net-10.20.0.0/27  net-10.1.24.0/23_net-10.20.0.0/27   vpn-zone    internal-zone-users grp-app-ldap
net-10.3.223.8/29 net-10.20.0.0/27  net-10.3.223.8/29_net-10.20.0.0/27  dmz-zone1   internal-zone-users tcp-389
net-10.1.194.64/26 net-10.20.0.64/27    net-10.1.194.64/26_net-10.20.0.64/27    dmz-zone2   internal-zone-servers   tcp-8080

我需要得到类似的东西:

net-10.1.24.0/23    net-10.20.0.0/27  net-10_1_24_0-23_net-10_20_0_0-27 vpn-zone    internal-zone-servers   udp-123

到目前为止,我实现了相同的结果,但将第三条记录保存到一个新文件中,取消了“。”并使用“/”与sed然后使用“paste file1 file2”将它们连接在一起。它也可以通过脚本完成。但我希望你能提出更智能,更简单的一线awk / sed解决方案的建议。

1 个答案:

答案 0 :(得分:2)

我会在第三个字段上进行2次替换,然后打印该行:

 awk '{gsub("[.]","_",$3);gsub("[/]","-",$3); print $0}' policy.txt
net-10.1.24.0/23 net-10.20.0.0/27 net-10_1_24_0-23_net-10_20_0_0-27 vpn-zone internal-zone-servers udp-123
net-10.1.24.0/23 net-10.20.0.0/27 net-10_1_24_0-23_net-10_20_0_0-27 vpn-zone internal-zone-users grp-app-ldap
net-10.3.223.8/29 net-10.20.0.0/27 net-10_3_223_8-29_net-10_20_0_0-27 dmz-zone1 internal-zone-users tcp-389
net-10.1.194.64/26 net-10.20.0.64/27 net-10_1_194_64-26_net-10_20_0_64-27 dmz-zone2