如何使用 sed 通过灵活的键和值更改我的配置文件?

新手上路,请多包涵

我想在配置文件中搜索此表达式:“central.database”。然后我想将与“central.database”关联的设置更改为“SQLTEST”。

配置文件的布局最初看起来像这样:

 central.database = SQLFIRSTTEST

这就是我希望它在 sed 替换后的样子:

 central.database = SQLTEST

我在 bash 脚本中执行此操作,欢迎任何建议、建议或替代解决方案!

(实际上 central.databaseSQLTEST 都来自这里的 bash 变量。)


我当前的代码(第三次尝试):

 sshRetValue=$(ssh -p "35903" -i $HOME/sshids/idrsa-1.old ${1} <<EOF
        sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
        echo $?
EOF
)

错误信息:

 Pseudo-terminal will not be allocated because stdin is not a terminal.
sed: -e expression #1, char 58: unknown option to `s'
-bash: line 3: EOF: command not found

原文由 prolink007 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 522
2 个回答

这是一个示例表达式:

 sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg

如果你想在里面匹配 / 的东西,你可以使用另一个分隔符:

 sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg

或使用变量扩展:

 VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg

在您的示例中:

 sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;

$CENTRAL_DB_NAME 之前有一个无效的 \1。此外, sed 不会打印它的返回值。这是检查返回值的首选方法:

 sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?

并最终通过管道连接到 ssh(未测试):

 sed_return_value=$(ssh server <<EOF
    sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
    echo $?
EOF
)

-i 用于替换输入文件中的数据。否则 sed 写入标准输出。

正则表达式是他们自己的一个领域。除非有一些特定的功能让您无法理解,否则无法在 stackoverflow 答案中深入解释它们。

原文由 sapht 发布,翻译遵循 CC BY-SA 3.0 许可协议

sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file

解释:

  • -i 告诉 sed 将结果保存到输入文件。没有它,sed 会将结果打印到标准输出。
  • /central\.database =/ 匹配包含斜杠之间的字符串的行: central.database =. 被转义,因为它是正则表达式中的特殊字符。
  • --- s/OLD/NEW/ 部分执行替换。 OLD 字符串是要匹配的正则表达式,而 NEW 部分是要替换的字符串。
  • 在正则表达式中, .* 表示“匹配任何东西”。所以 = .* 匹配等号、空格,然后是其他任何内容。

原文由 John Kugelman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题