2

在我的 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  

有人对我如何使它起作用有想法吗?

4

3 回答 3

1

这将为您工作:

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

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

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

sed 's#\047#\047\x47#g' <<< "test'test"
于 2016-02-18T15:27:02.483 回答
0

这可能对您有用(GNU sed):

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

第二个'结束对替代命令第一部分的引用。第三个'在 shell 中,因此被引用\'。然后引用替换命令的其余部分。在 substitutin 命令的 LHS 中使用&&as 整个匹配的简写加倍。

注意 最好使用单引号来引用 sed 命令,因为它消除了 shell 意外解释命令中字符的机会。

于 2016-02-19T00:32:09.307 回答
0

既然你指出:

我不能使用双引号

$'...'如果您的 shell 允许,您可能希望考虑使用(,和sh其他人允许):kshbash

sed $'s/\'/\'\'/g'
于 2016-02-19T07:30:07.930 回答