我希望能够使用我通过CLI传递给命令的字符串修改db001
。在任何给定时间db001
可能是不同的值,因此我无法查找该值。
./myscript modify_db <new value>
./myscript modify_db mynewdbname002
Before: database_node=db001.mydomain.local
After: database_node=mynewdbname002.mydomain.local
./myscript modify_db db003
Before: database_node=mynewdbname002.mydomain.local
After: database_node=db003.mydomain.local
答案 0 :(得分:1)
您可以使用类似的脚本,就像下面的输入参数具有替换值一样,
#!/bin/bash
perl -lpe "s/database_node=(\w+)/database_node=$1/g" file
只是做
./script.sh newdbname
使用-i
标记进行就地替换,-i.bak
使用原始文件的备份进行就地替换
perl -lpe -i.bak "s/database_node=(\w+)/database_node=$1/g" file
(或)使用简单的bash
函数
function replaceFile() {
perl -lpe -i.bak "s/database_node=(\w+)/database_node=$1/g" file
}
答案 1 :(得分:1)
您可以在脚本中使用此sed
命令:
sed "s/^\(database_node=\)[^.]*/\1$1/" file
示例:强>
s='database_node=db001.mydomain.local'
repl() {
sed "s/^\(database_node=\)[^.]*/\1$1/" <<< "$s";
}
并将其命名为:
repl mynewdbname002
database_node=mynewdbname002.mydomain.local
repl db003
database_node=db003.mydomain.local
答案 2 :(得分:0)
我会避免尝试从之前的状态生成新状态,而只是使用模板:
function modify_db() {
echo "database_node=$1.mydomain.local"
}
我在这里使用echo
进行说明,但显然你应该对"database_node=$1.mydomain.local"
做任何你想做的事。
假设在打印旧值后,它应该从文件database_node
修改以db_conf
开头的唯一行:
function modify_db() {
echo "Before: $(grep '^database_node=' db_conf)"
sed -i "s/^database_node=.*\.mydomain\.local/database_node=$1.mydomain.local/" db_conf
echo "After: $(grep '^database_node=' db_conf)"
}