使用sed在管道分隔文件中搜索和替换连续匹配

时间:2012-07-16 15:46:51

标签: csv sed

我有一个管道分隔的数据文件,我想通过LOAD DATA INFILE加载到Mysql中。

类似的东西:

a|||d|e
x|y|z|0|1
...

我想用\N替换空字段,以便将数据识别为NULL值。

  

sed's / || / | \\ N | / g'

几乎可以工作,但不完全 - 在第一个数据行中,第二个管道被sed占用,因此第二个连续的空字段未被解析!!!

我的hacky解决方法是管道第一个sed的结果进行另一次相同的搜索并替换第二次以去除那些连续的空字段。

我的问题是,在sed中解决这个问题的更优雅的方法是什么?(最好是一次通过)?

TIA。

附加说明

如果您打算使用sed处理数据文件,请注意这样的行尾案例:

  

H | I |Ĵ| K |

您需要管道

  

sed's / | $ / | \\ N / g'

处理那些行尾行为。

此外,如果您要从DOS系统转到UNIX系统,则可能需要使用sed search-and-replace从数据文件中删除“\ r”。

我建议您在使用LOAD DATA INFILE时考虑来自Mysql的所有警告 - 它们将帮助您捕获恶意案例。

1 个答案:

答案 0 :(得分:2)

您可以使用repeat(t)命令:

echo 'a|||d|e' | sed ':repeat; s/||/|\N|/g; t repeat'