unixsed命令替换包含的表达式\n数据库从sybase迁移到mysqlwindows unix纯文本编码

0wi1tuuw  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(327)

我正在将一个数据库从sybase迁移到mysql。为此,我将表导出到.csv文件中,然后将它们加载到mysql的新表中。在mysql中,空值被转换为0,所以我需要编辑.csv文件来找到没有值的地方,并用空值替换它们。
已编辑:我正在windows中从sybase导出.csv文件,并在unix虚拟机中使用它们。
空值可能出现在中间的列中:3,,,4,5——这里应该是3,null,null,4,5。为了实现这一点,我成功地使用了:

sed -i -e 's/,,/,NULL,/g' file_name.csv

(运行两次)。
问题是当null值位于最后一列时:3,4,5,--这应该看起来像3,4,5,null
在文本编辑器中,我成功地使用了find and replace:find:,\r\n replace:,null\r\n
我想从unix终端实现自动化,但它不起作用。我试过:

sed -i -e 's/,\r\n/,NULL\r\n/' file_name.csv

sed -i -e 's/,\\r\\n/,NULL\\r\\n/' file_name.csv

谢谢您!

ufj5ltwl

ufj5ltwl1#

使用两次

sed -ir 's/(^|,)(,|$)/\1null\2/g' file_name.csv

或者一次

sed -ir 's/(^|,)(,|$)/\1null\2/g;s/(^|,)(,|$)/\1null\2/g' file_name.csv

或者一次

sed -ir ':a;s/(^|,)(,|$)/\1null\2/g;ta' file_name.csv

这会将空行更改为 null .

cotxawn7

cotxawn72#

既然有windows crlf结尾,就需要运行 dos2unix 在输入文件上。
那么,你所需要的就是匹配 , 仅在行的末尾,并将其替换为 ,NULL .
以下是示例:

dos2unix -n file_in.csv file_out.csv
sed -i 's/,$/,NULL/' file_out.csv

注: -i 将改变
file_out.csv ,$ 匹配a , 在一行的末尾( $ )
sed 在线上运行,您不需要 g 修饰符,因为每行上只有一个行尾。

相关问题