한 파일에 있는 특정 단어를 다른 파일의 특정 단어로 바꾸는 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

등. 두 번째 파일은 file2ipv6을 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

다음 스크립트는 처음 두 단어를 각각 해시로 읽은 다음 IPV4를 IPV6으로 바꾸고 다른 패턴 확인을 중지합니다. 같은 줄에 두 개의 주소가 있을 수 있다고 생각되면 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실행하기 전에 백업이 필요합니다.

관련 정보