我正在使用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"
答案 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"