【问题标题】:search and replace string using sed使用 sed 搜索和替换字符串
【发布时间】:2013-10-17 16:41:42
【问题描述】:

我有一个像这样的 sed 命令来搜索和替换文件中的字符串:

sed -i -e 's/`db1`./`db2`./g' result/files1.sql

在以下文件中将 db1 替换为 db2 可以正常工作:result/files1.sql

但是,当我将其更改为 bash 和变量格式时,它不起作用。

sed -i -e "s/`${mydbname}`./`${mydbname2}`./g" "${mypath}"

我得到如下错误:

./mycoolscript: line 241: db1: command not found
./mycoolscript: line 241: db2: command not found

任何解决方案都会很棒。

【问题讨论】:

  • 为什么需要在 ${mydbname} 周围添加`?它使第二个 sed 命令认为 db1 是一个命令,而不是您要替换的字符串。请注意,shell 将替换 ""(引号)内的任何变量,包括 COMMAND,但不会替换 ''(单引号)内的变量。

标签: linux bash sed


【解决方案1】:

如果is something you need to replace, you will need to escape 由 .在这里

sed -i -e "s/\`${mydbname}\`./\`${mydbname2}\`./g" "${mypath}"

【讨论】:

    【解决方案2】:

    转义反引号字符

    sed -i -e "s/\`${mydbname}\`./\`${mydbname2}\`./g" "${mypath}"
    

    Bash 将反引号中的部分视为命令并首先执行。

    【讨论】:

      【解决方案3】:

      试试这个

      sed -i -e "s/${mydbname}/${mydbname2}/g" "${mypath}"
      

      【讨论】:

        【解决方案4】:

        还有另一种方法,对文字使用单引号,仅在变量/转义序列周围使用双引号。

        sed -i -e 's/`'"${mydbname}"'`./`'"${mydbname2}"'`./g' "${mypath}"
        

        由于使用单引号,您不必转义特殊字符。

        转义特殊字符与混合使用单引号和双引号之间的权衡取决于特殊字符的数量与变量的数量。

        如果需要转义的字符太多且变量数量较少,我更喜欢单引号和双引号的组合。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-21
          • 2012-05-05
          • 1970-01-01
          • 2014-09-13
          • 2017-06-08
          • 2018-12-05
          相关资源
          最近更新 更多