응용 프로그램을 설치하고 구성 파일을 업데이트하는 데 사용할 간단한 bash 스크립트를 작성하려고했습니다. 구성 파일을 수정하는 데 어려움을 겪고 있습니다.
# DBHost=localhost
DBName=test
# DBPassword=
어떻게 위와 같이 수정 할 수 있습니까?
DBHost=localhost
DBName=database
DBPassword=password
응용 프로그램을 설치하고 구성 파일을 업데이트하는 데 사용할 간단한 bash 스크립트를 작성하려고했습니다. 구성 파일을 수정하는 데 어려움을 겪고 있습니다.
# DBHost=localhost
DBName=test
# DBPassword=
어떻게 위와 같이 수정 할 수 있습니까?
DBHost=localhost
DBName=database
DBPassword=password
답변:
가장 좋은 방법은 사람이 파일을 수정해야하는지 여부, 파일이 얼마나 복잡한 지, 다른 사람이 다른 값을 원할 경우 스크립트가 우선 순위를 갖도록할지 여부에 따라 다릅니다. 즉, 파일에 이미이 포함되어 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
자동 모드에서 "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
':'새 / 더 / 다른 편집을 추가 모드, 아주 쉽게 또한 당신에게 나왔습니다 익숙한 것은.