Unix.команда sed.Замените выражение, содержащее \ n.Миграция базы данных из Sybase в MySQL.Кодировка простого текста в Windows-Unix - PullRequest
0 голосов
/ 24 октября 2018

Я перемещаю базу данных из 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

В текстовом редакторе я успешно использовал find и replace: Find:, \ r \ n Replace:, 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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

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

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

Вот пример:

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

Примечание:

  • -i изменит file_out.csv
  • ,$ соответствует , в конце строки ($)
  • Поскольку sed работает на линиях, вам не нужен модификатор g, так как имеется только 1 конецстрока в каждой строке.
0 голосов
/ 25 октября 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.

...