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_MODULEos.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"',引号删除从内部级别开始。因此,内部双引号扩展变量的值,外部单引号仅保留扩展值并将扩展值附加到字符串的其余部分。

相关内容