Bash 脚本将一个文件中存在的某些单词替换为另一个文件中的某些单词

Bash 脚本将一个文件中存在的某些单词替换为另一个文件中的某些单词

我有两个文件,第一个file1是 1000 行,其中包含路由器配置。有一部分是这样的——

 !
 ipv6 prefix-list CCAV6 seq 5 permit 2217:AB23::/40
 route-map DENY-ALL deny 11
 !
 ip pim sparse-mode
 ipv6 address 2617:FB23:0:1::1/128
 ipv6 ospf 1 area 0.0.0.0

等等。我的第二个文件file2是 ipv6 到 ipv4 地址的映射。看起来像这样——

 2617:FB23:0:1::1/128 245.82.242.31/32
 2217:AB23::/40 64.211.7.157/31

我希望能够替换遍历file1,如果我的第一列与file2的任何部分匹配file1,它应该将其替换为第二列file2

例如,我期望在处理后看到的输出是-

!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0

我尝试过使用awk,但我遇到的所有选项似乎都需要事先了解复制的位置,并且第一列的位置在整个过程中并不保持不变file1。我会很感激一些想法。

答案1

如果您不太担心多空格/制表符字段分隔符被file1替换为单个空格:

awk 'NR == FNR{a[$1]=$2; next}; 
  {for (i=1; i<=NF; ++i) printf "%s%s", $i in a?a[$i]: $i, i == NF?"\n": " "}' file2 file1

产量

!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0

答案2

以下脚本会将前两个单词中的每一个读入哈希值,然后用 IPV6 替换 IPV4,并停止检查其他模式,如果您认为同一行中可能存在两个地址,请if (j>0) break从代码中删除 , 。

混合地址代码

#!/usr/bin/nawk -f
BEGIN{while (getline<"map"){w[$1]=$2}}
{for (a in w){
    j=gsub(a,w[a])
    if (j>0) break
    }
    print
}

地图文件

2617:FB23:0:1::1/128 245.82.242.31/32
2217:AB23::/40 64.211.7.157/31

主机文件

!
ipv6 prefix-list CCAV6 seq 5 permit 2217:AB23::/40
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 2617:FB23:0:1::1/128
ipv6 ospf 1 area 0.0.0.0

执行

mixaddr hosts
!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0

华泰

答案3

#!/bin/bash
IFS=$'\n'
line=`cat ./file2`
for var in $line 
do
string1=`echo $var |awk '{print $1}'`
string2=`echo $var |awk '{print $2}'`
sed -i "s#${string1}#${string2}#g" ./file1
done

file1在运行之前您需要备份。

相关内容