Юникс. команда сэд. Замените выражение, содержащее \n. Миграция базы данных с Sybase на MySQL. Кодировка обычного текста Windows-Unix

Я переношу базу данных с Sybase на MySQL. Для этого я экспортирую таблицы в файлы .csv, а затем загружаю их в новые таблицы в MySQL. При этом значения NULL преобразуются в 0 в MySQL, поэтому мне нужно отредактировать файлы .csv, чтобы найти, где нет значений, и заменить их на NULL.

Отредактировано: я экспортирую файлы .csv из Sybase в Windows и работаю с ними на виртуальной машине Unix.

В средних столбцах могут появляться нулевые значения: 3,,,4,5 - здесь это должно выглядеть как 3,NULL, NULL,4,5 Для этого я успешно использовал:

sed -i -e 's/,,/,NULL,/g' file_name.csv

(и запустить его два раза).

Проблема в том, что значения NULL находятся в последнем столбце: 3,4,5, -- Это должно выглядеть как 3,4,5,NULL

В текстовом редакторе я успешно использовал поиск и замену: Найти: ,\r\n Заменить: ,NULL\r\n

Я хочу автоматизировать это с терминала Unix, но это не работает. Я старался:

sed -i -e 's/,\r\n/,NULL\r\n/' file_name.csv

sed -i -e 's/,\\r\\n/,NULL\\r\\n/' file_name.csv

Благодарю вас!


person berta gp    schedule 24.10.2018    source источник
comment
Используйте 1_. Возможно, вам придется использовать dos2unix для преобразования lnebreaks только в \n.   -  person Wiktor Stribiżew    schedule 24.10.2018
comment
Это будет работать, если строка начинается, заканчивается или содержит ноль: sed -i -e 's/^,/NULL,/' -e 's/,,/,NULL,/g' -e 's/,$/,NULL/' file_name.csv   -  person kenlukas    schedule 24.10.2018
comment
@kenlukas Это очистило файл   -  person berta gp    schedule 24.10.2018
comment
@bertagp, на какой ОС ты это делаешь. Он работал, как и ожидалось, на CentOS7 и Ubuntu 16.04. Это не работало на MacOS   -  person kenlukas    schedule 24.10.2018
comment
Возможный дубликат Заменить пустое значение CSV на NULL с помощью sed   -  person kenlukas    schedule 24.10.2018
comment
@WiktorStribiżew, вы были правы с преобразованием разрывов строк, поскольку я экспортировал файлы .csv в Windows, а затем использовал их на виртуальной машине Unix. Я сделал именно так: dos2unix -n file_in.csv file_out.csv sed -i 's/,$/,NULL/g' file_out.csv Большое спасибо всем.   -  person berta gp    schedule 25.10.2018


Ответы (2)


Поскольку у вас есть окончания Windows CRLF, вам нужно запустить dos2unix для входных файлов.

Затем все, что вам нужно, это сопоставить , только в конце строк и заменить их на ,NULL.

Вот пример:

dos2unix -n file_in.csv file_out.csv
sed -i 's/,$/,NULL/' file_out.csv

Примечание:

  • -i изменит file_out.csv
  • ,$ соответствует , в конце строки ($)
  • Поскольку sed работает со строками, вам не нужен модификатор g, так как в каждой строке есть только 1 конец строки.
person Wiktor Stribiżew    schedule 25.10.2018

Использовать дважды

sed -ir 's/(^|,)(,|$)/\1null\2/g' file_name.csv

или один раз

sed -ir 's/(^|,)(,|$)/\1null\2/g;s/(^|,)(,|$)/\1null\2/g' file_name.csv

или один раз

sed -ir ':a;s/(^|,)(,|$)/\1null\2/g;ta' file_name.csv

Это изменит пустую строку на null.

person Walter A    schedule 24.10.2018