我有一个如下所示的属性文件:
mysql.username=USERNAME
mysql.pass=PASS
我需要使用传递到shell脚本的变量值来更改USERNAME
和PASS
。我无法使用sed
,因为这将在第一次用“值”替换USERNAME和PASS时正常工作,但是一旦替换它们,sed将在第二次运行脚本时在文件中找不到变量名,因此问题。
如何处理?
答案 0 :(得分:0)
我相信实现目标的最简单方法是始终对未修改的模板文件执行替换,而不是尝试对生成的文件的先前版本进行操作:
# produce a first version of the file.properties
sed -e 's/USERNAME/user1/' -e 's/PASS/pass1/' file.properties.template > file.properties
# succesfully produce a second version of the file.properties
sed -e 's/USERNAME/user2/' -e 's/PASS/pass2/' file.properties.template > file.properties
另一种替代方法是更改脚本的输入(或代码?),以便您的搜索和替换操作不基于占位符值,而是基于属性名:
$ cat test.sh
#!/bin/bash
target=$1
shift
while key=$1 && value=$2 && shift 2; do
sed -i "s/^$key=.*/$key=$value/" $target
done
$ cat test.props
mysql.hostname=HOSTNAME
mysql.username=USERNAME
mysql.pass=PASS
$ ./test.sh test.props mysql.username sa mysql.pass clearTextPasswordsAreTerrible
$ cat test.props
mysql.hostname=HOSTNAME
mysql.username=sa
mysql.pass=clearTextPasswordsAreTerrible
$ ./test.sh test.props mysql.username secondTry mysql.pass successfullyModified
$ cat test.props
mysql.hostname=HOSTNAME
mysql.username=secondTry
mysql.pass=successfullyModified