在sed中转义字符

时间:2014-04-28 15:31:59

标签: sed escaping

我试图用sed替换几个php数据库数组变量的值,但它没有按预期工作

以下是一个例子:

echo \$DB['TYPE']='MYSQL' | sed "s|^$DB['TYPE']=.*$|$DB['TYPE']='POSTGRESQL'|g"

我正在尝试替换$DB['TYPE']='MYSQL' with $DB['TYPE']='POSTGRESQL'

我以这种方式逃脱了但不起作用,我不断获得$DB[TYPE]=MYSQL

echo \$DB['TYPE']='MYSQL' | sed "s|^\$DB[\'TYPE\']=.*$|\$DB[\'TYPE\']=\'POSTGRESQL\'|g"

提前致谢

4 个答案:

答案 0 :(得分:0)

  

我正在尝试替换$DB['TYPE']='MYSQL' with $DB['TYPE']='POSTGRESQL'

您可以使用:

sed "s|\(\$DB\['TYPE'\]=\)'MYSQL'|\1'POSTGRESQL'|g" file

答案 1 :(得分:0)

尽可能减少重复:

$ echo "\$DB['TYPE']='MYSQL'" |
  sed  "s|^\(\$DB\['TYPE'\]='\)[^']*|\1POSTGRES|"
$DB['TYPE']='POSTGRES'

您使用线锚,因此g修饰符无效 - 每个模式最多可匹配一次。

echo行需要双引号。如果没有它们,您将获得shell将单引号视为引号字符,而不是文字字符:

$ echo \$DB['TYPE']='MYSQL' 
$DB[TYPE]=MYSQL

答案 2 :(得分:0)

在你的例子中,sed找不到确切的短语。你为什么不直接交换想要交换的词呢

echo \$DB['TYPE']='MYSQL' | sed "s|MYSQL|POSTGRESQL|g"

答案 3 :(得分:0)

我最终选择了这个

echo "\$DB['TYPE']='MYSQL'" | sed "s|^\$DB\['TYPE'\]=.*$|\$DB\['TYPE'\]='POSTGRESQL'|"

它按预期工作。谢谢你们。