sed - 패턴과 일치하는 전체 줄을 바꾸고 다른 구분 기호를 사용합니다.

sed - 패턴과 일치하는 전체 줄을 바꾸고 다른 구분 기호를 사용합니다.

다음과 같은 구성 파일이 제공됩니다.

#!/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"'따옴표 제거는 내부 수준에서 시작됩니다. 따라서 내부 큰따옴표는 변수 값을 확장하고 외부 작은따옴표는 확장된 값을 유지하고 확장된 값을 문자열의 나머지 부분에 추가합니다.

관련 정보