次の構成ファイルが提供されます。
#!/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"'
引用符の削除は内部レベルで始まります。したがって、内部二重引用符は変数の値を拡張し、外部一重引用符は拡張値を保持し、拡張値を文字列の残りの部分に追加します。