Вы можете просто использовать следующую команду sed
:
sed 's/,,/,\\N,/g;s/,,/,\\N,/g;'
Демонстрация:
$ echo 'abc,,,,5,,,3.2,,' | sed 's/,,/,\\N,/g;s/,,/,\\N,/g;s/,,/,\\N,/g'
abc,\N,\N,\N,5,\N,\N,3.2,\N,
Пояснения:
s/,,/,\\N,/g
заменит ,,
на ,\N,
глобально для строки, однако вам нужно будет сделать два прохода в пространстве шаблона, чтобы убедиться, что все замены произошли, давая команды: s/,,/,\\N,/g;s/,,/,\\N,/g;
.
Дополнительные примечания:
Чтобы ответить на ваши сомнения относительно гибкости этого подхода, я подготовил следующий входной файл.
$ cat input_comma.txt
abc,,,,5,,,3.2,,
,,,,,,def,
1,,,,,,1.2
6commas,,,,,,
7commas,,,,,,,
Как видите, не имеет значения, сколько последовательных запятых присутствует во входных данных:
$ sed 's/,,/,\\N,/g;s/,,/,\\N,/g;s/,,/,\\N,/g' input_comma.txt
abc,\N,\N,\N,5,\N,\N,3.2,\N,
,\N,\N,\N,\N,\N,def,
1,\N,\N,\N,\N,\N,1.2
6commas,\N,\N,\N,\N,\N,
7commas,\N,\N,\N,\N,\N,\N,
При awk
аналогичный подход за 2 прохода может быть реализован таким же образом:
$ echo "test,,,mmm,,,,aa,," | awk '{gsub(/\,\,/,",\\N,");gsub(/\,\,/,",\\N,")} 1'
test,\N,\N,mmm,\N,\N,\N,aa,\N,