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专家帮忙?
如果要替换空字符(\ 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)
显示进程的环境
首先,您可以使正则表达式仅\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)
(正如评论所指出的,对于奇数个反斜杠,这仍然会给出错误的结果。)