shell 如何在sed命令中包含变量?[副本]

q1qsirdb  于 2023-10-23  发布在  Shell
关注(0)|答案(1)|浏览(92)

此问题已在此处有答案

Difference between single and double quotes in Bash(7个回答)
2天前关闭。
我有两个不同的配置文件如下:

# Database
database.url=jdbc:mysql://127.0.0.1/database_name

# API
api.port=5005

我想通过在shell脚本中使用sed命令来更改这两个命令。

我做了什么&问题:

这是我为实现它而编写的shell脚本:

DB_CONFIG_FILE=~/configs/database.properties
MYSQL_CONTAINER_PORT=3113

sed -i 's~^database.url=jdbc:mysql://127.0.0.1/database_name.*database.url=jdbc:mysql://127.0.0.1:${MYSQL_CONTAINER_PORT}/database_name~' $DB_CONFIG_FILE

TM_CONFIG_FILE=~/configs/tm.properties
PORT=5100

sed -i 's~^api.port=5005.*api.port=${PORT}~' $TM_CONFIG_FILE

然而,这给了我一个错误,说:

sed: -e expression #1, char : unterminated `s' command

是否有解决方案来包含脚本中声明的这些变量?谢谢你

期望值:

我的期望是将配置文件修改为如下所示:

# Database
database.url=jdbc:mysql://127.0.0.1:3113/database_name

# API
api.port=5100
ao218c7q

ao218c7q1#

几个原因:
1.您的sed命令已中断,因为在~之后没有替换

  1. Shell变量不会在单引号中展开,请使用双引号
  2. RegEx Meta字符,如.*?+需要在sed正则表达式中转义。
    下面的sed应该对你有用:
dbCfgFile=~/configs/database.properties
mysqlContainerPort=3113
sed -E -i.bak "s~^(database\.url=jdbc:mysql://127\.0\.0\.1)(/.*)~\1:$mysqlContainerPort\2~" "$dbCfgFile"

请注意,我建议使用.转义的正则表达式,并使用捕获组和反向引用来避免在模式和替换中重复相同的文本。
同样,对于第二个sed用途:

tmCfgFile=~/configs/tm.properties
port=5100
sed -E -i.bak "s/^(api\.port=).*/\1${port}/" "tmCfgFile"

PS:我已经将你的shell变量从所有大写重命名为 Camel 大小写,以避免与shell env变量冲突。

相关问题