Linux에서 키 이름과 일치하는 줄을 바꾸는 데 도움이 필요합니다.

Linux에서 키 이름과 일치하는 줄을 바꾸는 데 도움이 필요합니다.

입력 파일(2줄, 2개의 키-값 쌍):

key1 = "x"
key2 = ['a', 'b', 'c']

이 입력 파일을 사용하여 다른 파일의 키 값 쌍을 바꿔야 합니다.

File1(행 2개, 키-값 쌍 2개 포함):

key1 = "y"
key2 = ['p' , 'q', 'r']

이 작업을 수행하기 위한 쉘 스크립트의 쉬운 방법이 있는지 알려주십시오.

답변1

무엇을 보관하고 싶은지 완전히 확신할 수 없습니다. file.txt다음과 같이 텍스트와 키-값 쌍이 포함된 파일을 패치한다고 가정해 보겠습니다.

key1
key2
text
key1 = "original"
key2 = ['o' , 'r', 'i', 'g']
text

아래와 같이 patchfile.txt교체할 값만 포함하는 키-값 쌍

key1 = "patched"
key2 = ['p', 'a', 't', 'c', 'h']

이와 같은 결과를 얻기 위해 텍스트를 덮어쓰지 않거나 key1key2값 쌍을 사용하지 않음file.txt

key1
key2
text
key1 = "patched"
key2 = ['p', 'a', 't', 'c', 'h']
text

이런 명령을 내리면

patchmystuff.sh file.txt patchfile.txt

의 내용은 patchmystuff.sh다음과 같습니다.

#!/usr/bin/env bash

original_file=$1
patch_file=$2

# loop from here:
# https://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash
while IFS="" read -r line || [ -n "$line" ]
do
    printf 'patching %s\n' "$line"
    # (?<==) is the lookbehind for = to keep it
    # otherwise it will match key1/key2 in regular text
    search_string=$(echo "$line" | perl -ne 's/(?<==).*//g; print;')
    printf 'search string: "%s"\n' "$search_string"
    sed -i -e "s/$search_string.*/$line/g" "$original_file"
done < "$patch_file"

관련 정보