【问题标题】:modify a file using a bash script with sed使用带有 sed 的 bash 脚本修改文件
【发布时间】:2016-11-14 02:22:09
【问题描述】:

类似这些问题:

在这样的文件中:

define('_DB_NAME_', 'anything');
define('_DB_USER_', 'something else');
define('_DB_PASSWD_', 'and another value');

如何使用sed通过引用键值_DB_NAME__DB_USER__DB_PASSWD来替换值anythingsomethinganother(未知)?

【问题讨论】:

  • 您想替换第一行的第二个参数,还是替换出现在任何位置的'anything' 参数?
  • 我想根据键_DB_NAME_替换值anything(未知)

标签: linux bash sed


【解决方案1】:
sed "s/\(define('_DB_NAME_', \).*/\1'new value');/" filename

另外两个也是如此。

如果你想修改文件,你可以使用-i,但是你必须小心,不同版本的sed处理方式不同。

【讨论】:

    【解决方案2】:

    你可能想要:

    sed -E "
      s/('_DB_NAME_', ')[^']+/\1ABC/
      s/('_DB_USER_', ')[^']+/\1DEF/
      s/('_DB_PASSWD_', ')[^']+/\1GHI/
    "
    

    我认为 awk 更具可读性:

    awk -F "'" -v OFS="'" '
        $2 == "_DB_NAME_"   {$4 = "ABC"}
        $2 == "_DB_USER_"   {$4 = "DEF"}
        $2 == "_DB_PASSWD_" {$4 = "GHI"}
        {print}
    '
    

    【讨论】:

    • 第一个 sed 说:\1 not defined in the RE
    • 尝试使用 -r 而不是 -E 。您使用的是什么操作系统?
    • 现在是在macos上,不过最终会在linux上运行(具体我不知道,是运行apache的共享主机)
    【解决方案3】:
    sed -i -e 's/anything/newanything/g;s/something/newthing/g;s/another/newanother/' tempfile
    

    tempfile 包含您拥有的代码的位置。输出如下所示

    define('_DB_NAME_', 'newanything');
    define('_DB_USER_', 'newthing else');
    define('_DB_PASSWD_', 'and newanother value');
    

    【讨论】:

    • 为了清楚起见,我编辑了我的问题。 anything 的值未知。所以目标是通过引用_DB_NAME_来替换它
    • @francoisromain 啊,我明白了,对不起,我在那儿有点过火了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2019-05-08
    • 2021-12-18
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多