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

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

나는 애플리케이션을 설치하고 구성 파일을 업데이트하는 데 사용할 간단한 bash 스크립트를 작성하려고 노력해 왔습니다. 구성 파일을 수정하는 데 문제가 있습니다.

# DBHost=localhost
DBName=test
# DBPassword=

위의 내용을 다음과 같이 수정하는 방법에 대한 제안 사항이 있습니까?

DBHost=localhost
DBName=database
DBPassword=password

답변1

가장 좋은 접근 방식은 사람도 파일을 수정할 수 있는지 여부, 파일이 얼마나 복잡한지, 다른 사람이 다른 값을 원할 때 스크립트가 우선 적용되도록 할지 여부에 따라 달라집니다. 즉, 파일이 이미 포함된 경우 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

답변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필요한 변경이 이루어집니다.

답변3

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

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

Terden의 sed명령은 엄격하고 효율적이었습니다. 그러나 ex 명령과 쉘 문자열 보간으로 채워진 "document here"의 상호 작용은 매우 강력할 수 있습니다. 예를 들어, 비밀번호는 쉘 변수의 값으로 대체될 수 있습니다:

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

":" 패턴을 사용하고 vi익숙 하다면 vim새로운/더 나은/다른 편집 내용을 추가하는 것도 매우 쉽습니다 .

관련 정보