【问题标题】:Replace strings with variable in bash script用bash脚本中的变量替换字符串
【发布时间】:2017-07-18 08:50:09
【问题描述】:

我想创建一个 bash 脚本来更改应用程序的配置文件。该脚本将读取一个变量并将我想要更改的设置的值替换为变量值。

#!/bin/bash
mysqlurlenv1="jdbc:mysl://xx.xx.xx.xx:3306
mysqlurlenv2="jdbc:mysl://xx.xx.xx.xz:3306
configFile=app.conf
pattern=$1


case "$pattern" in

    1)
            sed -i.bak "s/^\(mysql.db.url =\).*/\1 ${mysqldburl_env1}/" 
            ;;
    2)
            sed -i.bak "s/^\(mysql.db.url =\).*/\1 ${mysqldburl_env2}/"
            ;;
    *)
            echo "Wrong input...try again"

    esac

我有一个包含以下条目的配置文件

mysql.db.driver = com.mysql.jdbc.Driver 
mysql.db.url = jdbc:mysql....
mysql.db.uname = admin

当我运行脚本时出现此错误 sed: -e expression #1, char 40: `s' 的未知选项

如何在配置文件中获取那些定义的变量?任何帮助将不胜感激

Rgds 丁

【问题讨论】:

  • 您不应该将 sed 与这样的扩展变量一起使用。您引用的变量有 / 被 sed 用作分隔符的引用,因此会出现 sed 错误。
  • 前两个变量没有终止。

标签: bash awk sed


【解决方案1】:

您正在使用这个 sed 模式 s/FIND_STRING/REPLACE_STRING,这是常用的方法。

但是您的REPLACE_STRING 包含/,因此您的模式将变为s/FIND_STRING/jdbc:mysl://....,这是无效的,因为它包含太多/

Sed 接受任何字符作为字段分隔符,因此在您的情况下,您需要将 sed 模式字段分隔符从 / 更改为其他内容,例如 |

例子:

$ mysqlurlenv1="jdbc:mysl://xx.xx.xx.xx:3306"
$ echo "mysql.db.url = jdbc:mysql" | sed "s|^\(mysql.db.url =\).*|\1 ${mysqlurlenv1}|"
mysql.db.url = jdbc:mysl://xx.xx.xx.xx:3306

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2022-07-21
    • 1970-01-01
    • 2020-12-21
    • 2018-01-22
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多