【问题标题】:replace a line that contains a string with special characters用特殊字符替换包含字符串的行
【发布时间】:2015-01-10 18:00:49
【问题描述】:

我想替换包含具有一些特殊字符的字符串的行。 我使用 \ 和 \ 来转义特殊字符,但文件中没有任何变化。 我像这样使用 sed:

> sed -i '/pnconfig\[\'dbhost\'\] = \'localhost\'/c\This line is removed.' tco.php

我只想找到包含以下内容的行:

$pnconfig['dbhost'] = 'localhost';

并将该行替换为:

  $pnconfig['dbhost'] = '1.1.1.1';

【问题讨论】:

    标签: sed


    【解决方案1】:

    将 sed 用双引号括起来

    sed -i "s/\(pnconfig\['dbhost'\] = \)'localhost'/\1'1.1.1.1'/" filename
    

    测试

    $ echo "\$pnconfig['dbhost'] = 'localhost';" | sed "s/\(pnconfig\['dbhost'\] = \)'localhost'/\1'1.1.1.1'/"
    $pnconfig['dbhost'] = '1.1.1.1';
    

    【讨论】:

    • 但是为什么要使用 /\1'1.1.1.1'/ 而不是 /'1.1.1.1'/ 呢?
    • @Mickey 因为\1 是第一个包含pnconfig\['dbhost'\] = 的捕获组。我有点懒得在replacemnet部分重新输入它们:P
    • 我使用了 sed -i "s/(pnconfig['dbhost'] = )'localhost'/pnconfig['dbhost'] = \'1.1.1.1'/" myfile 结果是相同的。但是为什么要在 'localhost' 之后使用 () 或为什么不使用 ),如下所示: sed -i "s/(pnconfig['dbhost'] = 'localhost')/pnconfig['dbhost'] = \'1.1.1.1' /" 我的文件
    【解决方案2】:

    如下使用:

    sed -i.bak '/pnconfig\[\'dbhost\'\] = \'localhost\'/pnconfig\[\'dbhost\'\] = \'1.1.1.1\'/' tco.php
    

    与其第一次修改文件,不如创建备份,然后搜索您的模式,然后将其替换为文件 tco.php 中的其他模式

    【讨论】:

      【解决方案3】:

      您不必担心通过对 sed 使用双引号来反斜杠。

      sed -i.bak "/pnconfig\['dbhost'\] = 'localhost'/s/localhost/1.1.1.1/g" File
      

      【讨论】:

        【解决方案4】:

        试试这个。

        sed "/$pnconfig\['dbhost']/s/localhost/1.1.1.1/"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-30
          • 2020-07-12
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-25
          相关资源
          最近更新 更多