あるファイルの特定の単語を別のファイルの特定の単語に置き換えるBashスクリプト

あるファイルの特定の単語を別のファイルの特定の単語に置き換えるBashスクリプト

2つのファイルがあり、最初のファイルは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

など。 2 番目のファイルは、file2ipv6 を ipv4 アドレスにマップすることです。それは次のとおりです -

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

繰り返し交換できるようにしたいですfile1。最初の列がfile2一部と一致する場合は、file12番目の列に置き換える必要があります。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

おすすめ記事