我有一个 .env 文件,需要复制到 .env.sh 文件。该命令导出到 .env.sh 文件:
scriptPath=$(dirname "$(readlink -f "$0")")
printenv | sed 's/^\(.*\)$/export \1/g' > ${scriptPath}/.env.sh
我的 .env 文件:
DB_MYSQL_TYPE=mysql
DB_MYSQL_CONNECTOR=pymysql
DB_MYSQL_USER=tuandc
DB_MYSQL_PASS=mypass
DB_MYSQL_HOST=mysql.host
DB_MYSQL_PORT=3306
DB_MYSQL_DBNAME=vietnam
我已将其导出到 .env.sh:
export DB_MYSQL_TYPE=mysql
export DB_MYSQL_CONNECTOR=pymysql
export DB_MYSQL_USER=tuandc
export DB_MYSQL_PASS=mypass~.(?Tweg
export DB_MYSQL_HOST=mysql.host
export DB_MYSQL_PORT=3306
export DB_MYSQL_DBNAME=vietnam
但我想用双引号来转义 DB_MYSQL_PASS 中的一些特殊字符:
printenv | sed -e 's/=\(.*\)/="\1/g' -e 's/$/"/g' >> ${scriptPath}/.env.sh
DB_MYSQL_TYPE="mysql"
DB_MYSQL_CONNECTOR="pymysql"
DB_MYSQL_USER="tuandc"
DB_MYSQL_PASS="mypass~.(?Tweg"
DB_MYSQL_HOST="mysql.host"
DB_MYSQL_PORT="3306"
DB_MYSQL_DBNAME="vietnam"
但我想结合上面的 2 个正则表达式来使 .env.sh 文件完整,如下所示:
export DB_MYSQL_TYPE="mysql"
export DB_MYSQL_CONNECTOR="pymysql"
export DB_MYSQL_USER="tuandc"
export DB_MYSQL_PASS="mypass~.(?Tweg"
export DB_MYSQL_HOST="mysql.host"
export DB_MYSQL_PORT="3306"
export DB_MYSQL_DBNAME="vietnam"
答案1
$ declare -px
declare
是一个看起来合适的 Bash 内置命令。此命令对现有变量分配中的 shell 特殊字符进行转义。
答案2
sed
使用流编辑器可以轻松完成:
sed -i.bak -e `s/=/="/;s/$/"/` .env.sh
这会:
-i.bak
- 就地编辑,原始文件保留为.env.sh.bak
.s/=/="/
-=
用。。。来代替 ”="
”。;
- 命令分隔符s/$/"/
- 匹配行尾并添加引号。
读man sed
答案3
在一个阶段中进行。与原始文件(.env
):
printenv | sed 's/\(^[^=]*\)=\(.*\)/export \1="\2"/' > "$scriptPath/.env.sh"
答案4
谢谢你们,我找到了连接 2 个正则表达式的解决方案,
printenv | sed -e 's/^\(.*\)$/export \1/g' -e 's/=\(.*\)/="\1/g' -e 's/$/"/g' >> ${scriptPath}/.env.sh