给定一个如下的配置文件:
#!/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"'
,引号删除从内部级别开始。因此,内部双引号扩展变量的值,外部单引号仅保留扩展值并将扩展值附加到字符串的其余部分。