다음과 같은 구성 파일이 제공됩니다.
#!/usr/bin/env python
import os
import sys
if __name__ == '__main__':
os.environ["DJANGO_SETTINGS_MODULE"] = "newspaper_project.a_string_which_need_to_be_changed"
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
sed
"a_string_which_need_to_be_changed"를 다음으로 바꿀 수 있습니다 .
sed -i '/DJANGO_SETTINGS_MODULE/c\ os.environ["DJANGO_SETTINGS_MODULE"] = "newspaper_project.the_new_string"' <PATH_TO_THE_ABOVE_CONFIG_FILE>
이것은 대체됩니다전선DJANGO_SETTINGS_MODULE
및 을 포함합니다 os.environ["DJANGO_SETTINGS_MODULE"] = "newspaper_project.the_new_string"
.
이제 "the_new_string"을 스크립트의 변수로 매개변수화하고 싶습니다.
#!/bin/bash
#=============================================================
SETTINGSPY="a_fresh_new_string"
#=============================================================
sed -i "s#DJANGO_SETTINGS_MODULE#c\os.environ['DJANGO_SETTINGS_MODULE'] = newspaper_project.\$SETTINGSPY" <PATH_TO_THE_ABOVE_CONFIG_FILE>
그러나 이것은 작동하지 않습니다. 왜냐하면 구분 기호를 기본값이 아닌 다른 것으로 변경해야 하기 '\'
때문에 of 변수를 이스케이프 처리할 수 있지만 '$'
이는 전체 줄을 대체하지 않고 다음과 같은 출력을 생성하는 패턴 일치만 대체하기 때문입니다.
os.environ[" os.environ["DJANGO_SETTINGS_MODULE"] = "newspaper_project.a_fresh_new_string"] = "newspaper_project.a_string_which_need_to_be_changed"
마지막 질문은 기본이 아닌 구분 기호를 사용하고 전체 줄을 어떻게 바꿀 수 있느냐는 것입니다.
나는 이런 해결책을 정말로 피하고 싶습니다.
sed -i "6s/.*/ os.environ['DJANGO_SETTINGS_MODULE'] = $SETTINGSPY_RELPATH/" <PATH_TO_THE_ABOVE_CONFIG_FILE>
물론입니다. 하지만 항상 행 Nr을 대체합니다. 6. 어느날 설정 파일이 늘어나면 스크립트가 손상될 수 있습니다.
답변1
sed
따라서 문제는 작은따옴표 안에 있는 표현식 내에서 변수를 사용하면서도 변수를 확장하는 방법으로 귀결됩니다 . 반드시 다른 구분 문자를 처리할 필요는 없지만 선택적으로 변수 부분을 큰따옴표로 개별적으로 인용하면 '..'
전체 스크립트를 다음과 같이 사용할 수 있습니다.
sed -i '/DJANGO_SETTINGS_MODULE/c\ os.environ["DJANGO_SETTINGS_MODULE"] = "newspaper_project.'"$SETTINGSPY"'"'
큰따옴표로 묶인 변수의 경우 '"$SETTINGSPY"'
따옴표 제거는 내부 수준에서 시작됩니다. 따라서 내부 큰따옴표는 변수 값을 확장하고 외부 작은따옴표는 확장된 값을 유지하고 확장된 값을 문자열의 나머지 부분에 추가합니다.