Скажи, что у меня нормальный CSV, как
# helloworld.csv
hello,world,,,"please don't replace quoted stuff like ,,",,
Если я хочу, чтобы mysqlimport
понял, что некоторые из этих полей NULL
, тогда мне нужно:
# helloworld.mysql.csv
hello,world,\N,\N,"please don't replace quoted stuff like ,,",\N,\N
Я получил некоторую помощь от другого вопроса - Почему sed не заменяет перекрывающиеся шаблоны - но обратите внимание на проблему:
$ perl -pe 'while (s#,,#,\\N,#) {}' -pe 's/,$/,\\N/g' helloworld.csv
hello,world,\N,\N,"please don't replace quoted stuff like ,\N,",\N,\N
^^
Как я могу написать регулярное выражение, чтобы оно не заменяло ,,
, если они заключены в кавычки?
ФИНАЛЬНЫЙ ОТВЕТ
Вот последний использованный Perl, благодаря принятому ответу ниже:
perl -pe 's/^,/\\N,/; while (s/,(?=,)(?=(?:[^"]*"[^"]*")*[^"]*$)/,\\N/g) {}; s/,$/,\\N/' helloworld.csv
Это заботится о ведущих, конечных и не заключенных в кавычки пустых строках.