我有一个像test.sql这样的文件:
'here is' and \' other for 'you'
并希望将\'
(转义的单引号)替换为''
(2个单引号)for postgres并单独留下其他单引号。我该怎么做我试过了:
Mon Mar 16$ sed -i.bak s/\'/''/g test.sql
但这会取出所有单引号。
答案 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