用单引号替换转义引号bash,sed

用单引号替换转义引号bash,sed,bash,macos,sed,tr,Bash,Macos,Sed,Tr,我正在准备一些数据,以便转储到psql数据库中 我遇到的问题是,我的数据包含转义双引号。我需要将\“替换为” 所以我需要改变: \“显示现金池历史记录\” 进入: “显示现金池历史记录” 当我试图将JSON解析为postgres时,当它到达“\”时,它会阻塞 我只是尝试使用bash中的工具(比如sed或tr)删除\“,并用单引号替换 我已经做了几个小时了。运气不好,请帮忙!!sed能够处理这个问题,您只需要小心引用。我在这里假设您的文件存储在b.txt中,但是cat b.txt可以用任何

我正在准备一些数据,以便转储到psql数据库中

我遇到的问题是,我的数据包含转义双引号。我需要将
\“
替换为

所以我需要改变:

\“显示现金池历史记录\”
进入:

“显示现金池历史记录”

当我试图将JSON解析为postgres时,当它到达“\”时,它会阻塞

我只是尝试使用bash中的工具(比如sed或tr)删除
\“
,并用单引号替换


我已经做了几个小时了。运气不好,请帮忙!!

sed
能够处理这个问题,您只需要小心引用。我在这里假设您的文件存储在
b.txt
中,但是
cat b.txt
可以用任何命令替换

$ cat b.txt | sed -e 's/\\"/'\''/g'
表达式由三个字符串连接而成,
s/\\“/
'
/g
。中间的一个表示为
\'
,另外两个表示为单引号

$ cat b.txt | sed -e "s/\\\\\"/'/g"
也可以,但可读性稍差

$ cat b.txt
\"show the cash pool history\"
输出是

'show the cash pool history'

sed
能够处理此问题,您只需小心报价即可。这里我假设您的文件存储在
b.txt
中,但是
catb.txt
可以用任何命令替换

$ cat b.txt | sed -e 's/\\"/'\''/g'
表达式由三个字符串连接而成,
s/\\“/
'
/g
。中间的一个字符串表示为
\'
,其他两个字符串为单引号

$ cat b.txt | sed -e "s/\\\\\"/'/g"
也可以,但可读性稍差

$ cat b.txt
\"show the cash pool history\"
输出是

'show the cash pool history'

您可以使用
awk
tr
作为
sed
的替代方案:

echo '\"show the cash pool history\"' # \"show the cash pool history\"
awk

awk '{ gsub(/\\"/, "\047"); print }'
在棘手的情况下,使用八进制值可能会有所帮助(047是单引号)

tr

tr -s '\\"' \'
这使用了一种简单的方法,类似于
awk
示例,使用
-s
选项(挤压)-将集合1中列出的重复字符序列的每个实例替换为集合2中指定的字符的单个实例

结果

'show the cash pool history'

您可以使用
awk
tr
作为
sed
的替代方案:

echo '\"show the cash pool history\"' # \"show the cash pool history\"
awk

awk '{ gsub(/\\"/, "\047"); print }'
在棘手的情况下,使用八进制值可能会有所帮助(047是单引号)

tr

tr -s '\\"' \'
这使用了一种简单的方法,类似于
awk
示例,使用
-s
选项(挤压)-将集合1中列出的重复字符序列的每个实例替换为集合2中指定的字符的单个实例

结果

'show the cash pool history'
另一种选择(GNU
sed

另一种选择(GNU
sed


您提到了JSON;这是JSON解析器能够理解的真实、正确的JSON吗?
jq
可能是正确的工具。您可以发布一个示例吗?撇号在JSON中不是合法的引号;您确定这是对的吗?如果您在PostgreSQL中有一个JSON列,那么我相信整个JSON文档都是单引号,类似于普通SQL字符串。但它不应该包含任何内容,除了双引号字符串值中的撇号之外……您提到JSON;这是JSON解析器能够理解的真实、正确的JSON吗?
jq
可能是正确的工具。您可以发布一个示例吗?撇号在JSON中不是合法的引号;您确定要使用它吗他是对的?如果你在PostgreSQL中有一个JSON列,那么我相信整个JSON文档都是单引号的,就像一个普通的SQL字符串一样。但是除了双引号字符串值中的撇号之外,它不应该包含任何内容。
awk
命令可以工作,但是
tr
命令很脆弱,因为它会转换任何独立的字符串ne
\
实例也是如此(
tr
从不匹配这样的多字符序列)。顺便说一句:使用
\'
'\047'
@mklement0更简单:谢谢你的评论;你肯定是对的,因为
tr
不是最通用的,尽管对于某些场景来说可能不是太糟糕;是的\'更简单,但我实际上展示了八进制值也可以使用(事后看来,我认为也足够了)-很好的建议,非常感谢。
awk
命令可以工作,但是
tr
命令很脆弱,因为它还可以翻译任何独立的
\
实例(
tr
从不匹配多字符序列本身)顺便说一句:使用
\'
'\047'
@mklement0更简单:谢谢你的评论;你肯定是对的,因为
tr
不是最通用的,尽管它对某些场景来说可能不太坏;是的\'更简单,但我实际上展示了八进制值也可以使用(事后看来,我也认为一次就足够了)-很好的建议,非常感谢。哦,他推出了伏都教十六进制!比八进制符号更容易!否则你必须做逃避引号的神圣仪式…我不反对…十六进制通常是我的偏好,但我最近感觉不太好。简单回答+1这是简短的,但请注意问题已标记;macOS
sed
不支持替换字符串中带有前缀的十六进制转义序列(或任何转义序列(除反向引用外))的
\x
.哦,他推出了伏都教十六进制!比八进制更简单!否则你必须做逃避引号的神圣仪式…我不会反对…十六进制通常是我的偏好,但我最近感觉不太好。简单回答+1这比较短,但请注意问题是有标签的;macOS
sed
不支持
\x-前缀十六进制转义序列(或任何转义序列)(不包括反向引用