Sed命令无法识别撇号

时间:2016-02-18 15:21:21

标签: bash postgresql sed gnu-sed

在我的bash脚本中,我试图用csv文件中的两个撇号('')替换所有撇号('),以便将其提交到postgres数据库。如您所知,postgres查询中的所有单引号都需要使用撇号进行转义。

我不能在查询中使用双引号,因为它们中也有双引号。因此除了使用sed进行毯子替换之外,没有简单的方法。我已经尝试了以下方法,但无济于事:

sed "s/\'/\'\'/g" test.txt   #Does not work

sed "s/'/''/g" test.txt      #Does not work  

sed s/\'/"\'\'"/g test.txt   #Does not work  

有没有人对如何让它发挥作用有想法?

3 个答案:

答案 0 :(得分:0)

这对你有用:

sed "s/'/''/g"  <<< "test'test"

由于您使用双引号括起命令,因此撇号不需要转义。

顺便说一下,如果你想用单引号括起命令本身,你可以在命令中使用撇号\047的八进制表示:

sed 's#\047#\047\x47#g' <<< "test'test"

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed 's/'\''/&&/g' file

第二个'结束了替换命令第一部分的引用。第三个'位于shell中,因此引用\'。然后引用替换命令的其余部分。使用&&作为substitutin命令的LHS中整个匹配的简写,加倍。

N.B。最好使用单引号引用sed命令,因为它消除了shell意外解释命令中字符的可能性。

答案 2 :(得分:0)

由于您表示:

  

我不能使用双引号

如果你的shell允许$'...'shksh和其他人这样做,你可能希望考虑使用bash

sed $'s/\'/\'\'/g'