Unix。命令。替换包含 \n 的表达式。数据库从 Sybase 迁移到 MySQL。 Windows-Unix纯文本编码

Unix. sed command. Replace a expression containing \n. Database migration from Sybase to MySQL. Windows-Unix plain text encoding

我正在将数据库从 Sybase 迁移到 MySQL。为此,我将表格导出到 .csv 文件中,然后将它们加载到 MySQL 中的新表格中。 执行此操作时,MySQL 中的 NULL 值将转换为 0,因此我需要编辑 .csv 文件以查找没有值的位置并将其替换为 NULL。

已编辑:我正在 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

在文本编辑器中,我使用查找和替换成功: 查找:,\r\n 替换:,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

谢谢!

使用两次

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

或一次

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

或一次

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

这会将空行更改为 null

因为你有 Windows CRLF 结尾,你需要 运行 dos2unix 输入文件。

然后,您只需要匹配行尾的 , 并将它们替换为 ,NULL.

示例如下:

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

注:

  • -i 将更改 file_out.csv
  • ,$ 匹配行尾的 , ($)
  • 由于 sed 对行进行操作,因此不需要 g 修饰符,因为每行只有 1 个行尾。