使用Bash替换行内的未知字符串

时间:2017-01-13 16:41:09

标签: bash sed

我希望能够使用我通过CLI传递给命令的字符串修改db001。在任何给定时间db001可能是不同的值,因此我无法查找该值。

./myscript modify_db <new value>

的myfile.txt

./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    

3 个答案:

答案 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)"
}