Я уверен, что вы также можете сделать это в sed
но мне намного проще в Perl:
perl -pe 's/([^,])\"/$1xxx/g; s/xxx,/\",/g; s/xxx/\"\"\"/g' data.txt
ОБЪЯСНЕНИЕ:
perl -pe
: выполнить скрипт, указанный в командной строке в каждой строке входного файла
s/([^,])\"/$1xxx/g;
заменить каждое вхождение "
которому предшествует любой не запятый символ, на случайную строку xxx
. Это предполагает, что ваши данные никогда не будут содержать xxx
.
s/xxx,/\",/g;
заменить те xxx
, за которыми следует запятая, обратно на ",
,.
s/xxx/\\\"/g
: заменить остальные xxx
на экранированные кавычки \"
, это будут те "
которые были в ваших данных.
ПРИМЕР:
$ cat test.txt
"data","da"t"a","data","data","foo "bar" foo", "data"
$ perl -pe 's/([^,])\"/$1xxx/g; s/xxx,/\",/g; s/xxx//g' test.txt
"data","data","data","data","foo bar foo","data