使用sed在字段周围添加引号(null除外)

时间:2016-09-29 20:45:36

标签: mysql linux sed

我正在使用mysql客户端将表的记录导出为CSV文件。一切正常,除非记录有空字段。

mysql --execute="SELECT * FROM users"| sed 's/\t/","/g;s/^/"/;s/$/"/;' > users.csv

可生产

"John","Smith","john@smith.com","NULL","NULL","347-1234566" 

如何生成这样的结果,其中NULL值被添加到文件中而没有引号

"John","Smith","john@smith.com",NULL,NULL,"347-1234566" 

2 个答案:

答案 0 :(得分:1)

尝试:

mysql --execute="SELECT * FROM users"| sed 's/\t/","/g; s/^/"/; s/$/"/; s/"NULL"/NULL/g' > users.csv

对命令的唯一更改是添加了s/"NULL"/NULL/g

如果sed支持前瞻或后瞻性正则表达式功能,可能有更复杂的方法,但它没有这样的功能。

实施例

将此制表符分隔的文件作为示例输入:

$ cat file
John    Smith   john@smith.com  NULL    NULL    347-1234566 

您可以通过以下方式实现所需的输出:

$ sed 's/\t/","/g; s/^/"/; s/$/"/; s/"NULL"/NULL/g' file
"John","Smith","john@smith.com",NULL,NULL,"347-1234566 "

答案 1 :(得分:0)

$ cat ip.txt 
John    Smith   john@smith.com  NULL    NULL    347-1234566

一些正则表达式魔法,礼貌The Greatest Regex Trick Ever

$ perl -lpe 'tr /\t/,/; s/NULL(*SKIP)(*F)|([^,]+)/"$1"/g' ip.txt 
"John","Smith","john@smith.com",NULL,NULL,"347-1234566"
  • tr /\t/,/用逗号替换所有标签。这使得替换更容易
  • NULL(*SKIP)(*F)忽略此模式
  • ([^,]+)捕获一个或多个非逗号字符
  • "$1"用双引号
  • 围绕捕获的字符串


替代方式,使用map转换每个元素

$ perl -lane 'print join ",", map{ /^NULL$/ ? $_ : "\"$_\"" } @F' ip.txt
"John","Smith","john@smith.com",NULL,NULL,"347-1234566"