sed:如何替换\ 0,但不是\\ 0

Ana*_*thu 3 regex sed backslash

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

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

sed 's/\\0/ /g' $dumpfile
Run Code Online (Sandbox Code Playgroud)

当线路出现时注意到一个问题320.48k\\02. Easy Listening.

$ echo '320.48k\\02. Easy Listening' | sed 's/\\0/ /g'
320.48k\ 2. Easy Listening
Run Code Online (Sandbox Code Playgroud)

那不是我想要的.\\后跟的0字符不是空字符.我想保持原样.

有没有sed专家帮忙?

BOC*_*BOC 8

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

sed 's/\x0/ /g'
Run Code Online (Sandbox Code Playgroud)

要么

tr '\0' ' '
Run Code Online (Sandbox Code Playgroud)

我经常使用

tr '\0' '\n'< /proc/13217/environ 
Run Code Online (Sandbox Code Playgroud)

显示进程的环境


Jon*_*ely 3

首先,您可以使正则表达式仅\0在跟随除以下内容之外的内容时匹配\

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

这解决了问题,但当\0位于行开头时失败,因此将前面的匹配设置为可选:

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

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

另一种选择是说\0必须出现在行的开头,或者前面的字符不能是\

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

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