あるファイルの特定の単語を別のファイルの特定の単語に置き換える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

答え2

次のスクリプトは、最初の2つの単語をそれぞれハッシュとして読み込み、IPV4をIPV6に置き換えて、他のパターンチェックを停止します。同じ行に2つのアドレスがあると思われる場合は、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実行する前にバックアップが必要です。

関連情報