[英]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
其中替代$MYIP
在myShortFile
与172.19.0.2
,并打印输出结果屏幕。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.