繁体   English   中英

SED 语句替换 Shell 脚本中的变量

[英]SED statement to replace variable inside Shell Script

我创建了一个 bash 脚本,它获取一个 IP 地址作为变量${MYSQL_SERVER_IP} 然后我想在 sed 中传递它以替换 settings.py 文件中以前的 IP 地址。 这是我最接近实际运行没有错误的 sed 语句:

export MYSQL_SERVER_IP= '172.19.0.2'
sed -i -e '/DB_HOST =/c\DB_HOST = os.getenv( '\''IP'\'', '\''${MYSQL_SERVER_IP}'\'')\' Flask-URL-Shortener/settings.py

问题是脚本没有用变量的值替换变量。

在运行脚本之前的文件中:

DB_HOST = os.getenv( 'IP', '172.31.0.2')

目前我得到的输出是错误的:

DB_HOST = os.getenv( 'IP', '${MYSQL_SERVER_IP}')

因为我想获得以下输出:

DB_HOST = os.getenv( 'IP', '172.19.0.2')

这个 sed 语句是我需要修复的最后一行代码,以使我的程序按照我想要的方式工作。

我不认为你想在这里使用c 做就是了:

sed -e '/DB_HOST\s*=/s/${MYSQL_SERVER_IP}/'"${MYSQL_SERVER_IP}"/

您可以将替换限制为包含DB_HOST =的行,但您无需尝试在替换中对该文本执行任何操作。 只更换需要更换的部分。 请注意,如果 MYSQL_SERVER_IP 包含正斜杠,这将失败,因此您需要验证数据。

根据您的评论,您似乎需要以下命令

sed '/DB_HOST/s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/'"$MYSQL_SERVER_IP"'/' yourfile

其中替换命令s仅应用于匹配DB_HOST模式的行(您可以使其更复杂,例如/DB_HOST *= */ ,以匹配DB_HOST后跟= ,后者前后跟零个或多个空格); s命令的正则表达式包含 4 个匹配 1 到 3 位数字 ( [0-9]\\{1,3\\} ) 的表达式,中间穿插着文字点\\. .

原答案

请,如果接下来的三行没有描述您的情况,请发表评论并澄清。

假设myShortFile只包含这一行(因为它是一个简单的文本文件,所有字符,包括$ ,都是文字):

IP = $MYIP

然后,如果您运行这样的bash脚本:

#!/bin/bash
MYIP="172.19.0.2"
sed 's/$MYIP/'"$MYIP"'/' myShortFile

你会得到

IP = 172.19.0.2

原因是在字符串连接'…'"…"'…' ,第一和第三部分( 's/$MYIP/'/ )被bash逐字解释,因为它们被括在单引号( ' ),而$MYSIP中间一块"$MYIP"展开,因为它是在双引号(间" ),其结果是, bash将执行命令

sed 's/$MYIP/172.19.0.2/' myShortFile

其中替代$MYIPmyShortFile172.19.0.2 ,并打印输出结果屏幕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM