С помощью awk вы можете сделать что-то подобное, чтобы избежать очень сложного регулярного выражения . Тот факт, что разбит только пятый столбец, что предыдущие столбцы не содержат запятых и что мы знаем, что существует фиксированное количество столбцов, облегчает восстановление:
Отредактировано с помощью gsub
для переносимости, предложенной Эд Мортоном
awk '
BEGIN{FS=OFS=","}
{
for(i=6; i<=NF-3;i++){
$5 = $5 FS $i
}
}
{
gsub(/"/, "", "g", $5)
}
{print $1,$2,$3,$4,"\""$5"\"",$(NF-2),$(NF-1),$NF}
' <file>
Вывод:
"123","456",,17,"hello, how are you this, fine, highly caffienated morning,","2018-05-29T18:58:10-05:00","XYZ",
"345","737",,16,"Heading to a meeting, unprepared while trying to be awake","2018-05-29T18:58:10-05:00","ACD",
Если вы хотите экранировать кавычки, вы можете использовать это:
awk '
BEGIN{FS=OFS=","}
{
for(i=6; i<=NF-3;i++){
$5 = $5 FS $i
}
}
{
gsub(/^"|"$/,"",$5);
gsub(/"/,"\\\"",$5);
$5="\""$5"\"";
}
{print $1,$2,$3,$4,$5,$(NF-2),$(NF-1),$NF}
' <file>
Вывод:
"123","456",,17,"hello,\" how are you this, fine, highly caffienated morning,","2018-05-29T18:58:10-05:00","XYZ",
"345","737",,16,"Heading to a \"meeting\", unprepared while trying to be \"awake","2018-05-29T18:58:10-05:00","ACD",