Bash 스크립트: 한 파일의 값을 다른 파일로 교체

Bash 스크립트: 한 파일의 값을 다른 파일로 교체

다음과 같은 파일( )이 있습니다 one.cnf.

KEY1="value1"
KEY4="VALUE4"

또 다른 파일( two.cnf)은 다음과 같습니다.

USER_HOST="local"
KEY1="abc"
PASS="lorem"
KEY2="ABC"
KEY4="XYZ"

해당 변수의 값을 읽어서 one.cnf교체하고 싶습니다 two.cnf.
그래서 그것은 다음 two.cnf과 같이 보입니다.

USER_HOST="local"
KEY1="value1"
PASS="lorem"
KEY2="ABC"
KEY4="VALUE4"

답변1

사용법 awk: 파일 1에서 키를 읽은 다음 파일 2를 바꿉니다.

awk 'BEGIN{FS=OFS="="}
     NR==FNR {key[$1]=$2 ; next }
     $1 in key {$2=key[$1]}
     1' one.cnf two.cnf

교체가 필요하신 경우 이용해주세요sponge

awk '<code>' one.cnf two.cnf | sponge two.cnf

또는 GNU awk내부에서 one.cnf삭제되지 않도록 코드를 약간 변경해야 합니다.

awk -i inplace 'BEGIN{FS=OFS="="}
     NR==FNR {key[$1]=$2}
     FNR!=NR && $1 in key {$2=key[$1]}
     1' one.cnf two.cnf

-i inplace -v INPLACE_SUFFIX=.bup- 접미사를 사용하여 원본 파일을 .bup백업하는 데 사용됩니다 .

답변2

이는 파일 1의 값 키에 슬래시 문자가 없다고 가정하는 /간단한 접근 방식입니다 .

while IFS="=" read key value; do sed -i "s/^${key}=.*/${key}=${value}/" two.cnf ; done < one.cnf

여기서 문제 중 하나는 두 파일의 일부 키 값이 동일한 경우에도 파일을 변경한다는 것입니다. 변경할 필요가 없는 키로 파일을 변경하지 않으려면 간단한 grep을 추가할 수 있습니다.

while IFS="=" read key value; do grep -xq "${key}=${value}" two.cnf || sed -i "s/^${key}=.*/${key}=${value}/" two.cnf ; done < one.cnf

또는 grep과 단일 sed 명령 없이:

while IFS="=" read key value; do sed -i "/^${key}=/{/^${key}=${value}$/! s/^${key}=.*/${key}=${value}/}" two.cnf ; done < one.cnf

기타 참고할 사항:

  • 첫 번째 파일의 키가 두 번째 파일에 없으면 추가되지 않습니다.
  • 첫 번째 파일에는 key=value 형식의 줄만 포함되어 있고 다른 유형의 줄은 포함되어 있지 않다고 가정합니다.
  • 또한 문제가 발생할 경우를 대비해 진행하기 전에 두 번째 파일을 백업하는 것이 좋습니다.

답변3

#!/bin/bash           
for val in cat one.cnf          
do       
    KEY=`echo $val | cut -d'=' -f1`     
    VALUE=`echo $val | cut -d'=' -f2`    
    EXISTS=`grep -i "$KEY" two.cnf | grep -v grep`     
    if [ -n "$EXISTS" ]; then       
        VALUE2=`echo "$EXISTS" | cut -d'=' -f2`     
        echo "$VALUE-$VALUE2"                
        sed -i 's/'$VALUE2'/'$VALUE'/g' two.cnf     
    fi      
done

위치에 따라 파일 경로를 변경하세요.

관련 정보