bash 스크립트를 통해 구성 파일 편집


9

응용 프로그램을 설치하고 구성 파일을 업데이트하는 데 사용할 간단한 bash 스크립트를 작성하려고했습니다. 구성 파일을 수정하는 데 어려움을 겪고 있습니다.

# DBHost=localhost
DBName=test
# DBPassword=

어떻게 위와 같이 수정 할 수 있습니까?

DBHost=localhost
DBName=database
DBPassword=password

나는 매우 일반적인 작업을 수행하기 위해 오류가 발생하기 쉬운 정규 표현식을 작성해야한다고 믿을 수 없습니다. "update_config test.confg -uncomment_if_pressent DBHost = localhost"와 같은 표준화 된 도구가 있어야합니다.
bigjosh

답변:


3

가장 좋은 방법은 사람이 파일을 수정해야하는지 여부, 파일이 얼마나 복잡한 지, 다른 사람이 다른 값을 원할 경우 스크립트가 우선 순위를 갖도록할지 여부에 따라 다릅니다. 즉, 파일에 이미이 포함되어 DBPassword=swordfish있으면이를 유지하거나 대체 DBPassword=password하시겠습니까?

이 문제를 처리하는 일반적인 방법은 파일의 섹션을 "매직 주석"으로 구분하고 이러한 주석 사이의 부분 만 편집하는 것입니다. awk로 이것을 수행하는 방법이 있습니다. 마법의 설명이 없으면 파일 끝에 새 섹션이 추가됩니다. 경고 : 테스트되지 않은 코드.

begin_marker='# BEGIN AUTOMATICALLY EDITED PART, DO NOT EDIT'
end_marker='# END AUTOMATICALLY EDITED PART'
new_section='DBHost=localhost
DBName=database
DBPassword=password'
export begin_marker end_marker
awk <file.conf >file.conf.new -v begin_marker="$begin_marker" -v begin_marker="$end_marker" -v new_section="$new_section" '
    1 {print}
    $0 == begin_marker && !changed {
        do {getline} while ($0 != end_marker); # discard old section content
        print new_section;
        print;
        changed = 1;
    }
    END {if (!changed) {print begin_marker; print new_section; print end_marker;}}
'
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf

구성 파일을 읽는 프로그램이 동일한 구성 항목을 설정하는 여러 줄을 지원하지 않으면이 방법이 제대로 작동하지 않습니다. 이 경우 이전 항목을 제거해야합니다. 이 경우 주석을 그대로 유지하고 마지막에 자신의 설정을 추가하는 것이 좋습니다.

grep -vE '^[[:blank:]]*(DBHost|DBName|DBPassword)=$' <file.conf >file.conf.new
cat <<EOF >>file.conf.new
DBHost=localhost
DBName=database
DBPassword=password
EOF
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf

이 코드를 테스트 했습니까? 아니면 여전히 테스트되지 않았습니까?
rubo77

여기에 다른 훌륭한 예가 있습니다 : stackoverflow.com/questions/5955548/…
rubo77

2

그것이 당신이 필요한 전부라면, 당신은 같은 것을 할 수 있습니다

sed  -i.bak -e 's/DBName=.*/DBName=database/' \
 -e 's/#* *DBHost=.*/DBHost=localhost/' \
 -e 's/#* *DBPassword=.*/DBPassword=password/' config.file

원본 config.file을 복사 config.file.bak하고 필요한 사항을 변경합니다.


2

자동 모드에서 "ex"를 사용하겠습니다.

ex -s $CONFIG_FILE << END_CMDS
%s/^#.DBHost/DBHOST/
%s/DBName=test/DBName=database/
%s/^#.DBPassword/DBPassword/
w!
q
END_CMDS

terdon의 sed명령은 간결하고 효율적입니다. 그러나 ex 명령과 셸 문자열 보간으로 가득 찬 "여기 문서"의 상호 작용은 강력 할 수 있습니다. 예를 들어, 비밀번호는 쉘 변수의 값으로 대체 될 수 있습니다.

%s/^#.DBPassword=password/DBPassword=$PASSWORD/

당신이 사용하는 경우 vi또는 vim':'새 / 더 / 다른 편집을 추가 모드, 아주 쉽게 또한 당신에게 나왔습니다 익숙한 것은.


ex는 강력하지만 오류를 복구하기는 어렵습니다 (예 : 예상 라인이 누락 된 경우). 여기에서 조건부 동작없이 벗어날 수 있지만 그렇게 일반화되지는 않습니다.
Gilles 'SO- 악의를 멈춰라'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.