在bash脚本中用变量替换字符串

时间:2017-07-18 08:50:09

标签: bash awk sed

我想创建一个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表达式#1,char 40:'s'的未知选项

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

RGDS 丁

1 个答案:

答案 0 :(得分:0)

您正在使用此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