4

我正在从 mysql 迁移到 postgres。作为其中的一部分,我在将其加载到 postgres 之前使用 sed 处理 mysql 转储。

我的 MySQL 转储有一些\0字符,而 postgres 不喜欢它们。所以我用空格替换它们。

sed 's/\\0/ /g' $dumpfile

当线路有320.48k\\02. Easy Listening.

$ echo '320.48k\\02. Easy Listening' | sed 's/\\0/ /g'
320.48k\ 2. Easy Listening

那不是我很想要的。\\后面的0字符不是空字符。我想保持原样。

周围有 sed 专家帮忙吗?

4

3 回答 3

10

如果要替换空字符 (\0),可以使用:

sed 's/\x0/ /g'

或者

tr '\0' ' '

我用很多

tr '\0' '\n'< /proc/13217/environ 

显示进程的环境

于 2013-08-12T13:05:27.163 回答
4
于 2013-08-12T13:09:50.790 回答
3

首先,您可以使正则表达式仅\0在它遵循以下内容时才匹配\

$ echo '320.48k\\02. Easy Listening' | sed 's/\([^\\]\)\\0/\1 /g'
320.48k\\02. Easy Listening

这解决了问题,但\0在行首时失败,因此将前面的匹配设为可选:

$ echo '\0320.48k\\02. Easy\0Listening' | sed 's/\([^\\]\)\?\\0/\1 /g'
 320.48k\ 2. Easy Listening

但这不起作用,因为\\0可以将正则表达式与括号中的子组的零出现匹配。

另一种选择是说\0必须要么出现在行首,要么前面的字符不能是\

$ echo '\0320.48k\\02. Easy\0Listening' | sed 's/\([^\\]\|^\)\\0/\1 /g'
 320.48k\\02. Easy Listening

(正如评论指出的那样,对于奇数个反斜杠,这仍然会给出错误的结果。)

于 2013-08-12T13:04:56.340 回答