如何使用sed替换''和''

时间:2015-03-16 20:52:55

标签: sed

我有一个像test.sql这样的文件:

'here is' and \' other for 'you'

并希望将\'(转义的单引号)替换为''(2个单引号)for postgres并单独留下其他单引号。我该怎么做我试过了:

Mon Mar 16$ sed -i.bak s/\'/''/g test.sql 

但这会取出所有单引号。

2 个答案:

答案 0 :(得分:2)

你的敌人就是报价。字符串

s/\'/''/g
在给sed之前,

被shell破坏了。对于shell,''是一个空字符串,\'抑制了单引号的这种特殊含义(因此引号是实际的单引号字符)。 sed在处理后看到的是

s/'//g

...只删除所有单引号。

有几种方法可以解决这个问题;其中一个是

sed -i.bak "s/\\\\'/''/g" test.sql

在双引号shell字符串中,需要转义反斜杠(存在例外情况)。这意味着shell命令中的"s/\\\\'/''/g"转换为s/\\'/''/g作为sed的参数。在sed正则表达式中,反斜杠也需要转义,所以这实际上就是我们想要发生的事情:\'的所有实例都将替换为''

答案 1 :(得分:0)

sed "s/[\\]'/''/g" test.sql
# also work but may depend on shell
sed "s/[\]'/''/g" test.sql

与Wintermute相同的想法,但使用类来避免shell的多次转义,而不是双引号中的sed