Как сделать поиск / замену в «двоичном» файле из командной строки - PullRequest
1 голос
/ 19 декабря 2008

У меня есть несколько файлов данных для импорта в базу данных с некоторыми «уникальными» разделителями:

Разделитель поля (FS): SOH (ASCII символ 1)

Разделитель записей (RS): STX (символ 2 ASCII) + ’\ n’

Я бы хотел импортировать файлы в Postgres с помощью команды COPY, но, хотя я могу указать разделитель настраиваемого поля, он не может обрабатывать разделитель записей.

Я также не могу просто вырезать \ 002 из данных, потому что если в одном из полей (и они есть) есть новая строка, то КОПИЯ будет неправильно думать, что это новая запись, хотя на самом деле это не так.

Следует отметить одну важную вещь: не важно, что в полях сохраняются символы новой строки, хорошо, если они просто преобразуются в пробел.

Имея это в виду, я думал о том, чтобы использовать что-то вроде «sed» для преобразования новых строк в пробелы, а затем преобразования \ 002 в новые строки. Тем не менее, поскольку sed - это инструмент, основанный на строках, он не видит новые строки в конце каждой строки и не может выполнять поиск / замену по ним.

Существуют ли какие-либо другие инструменты командной строки Unix, которые могут выполнить эту работу?

РЕДАКТИРОВАТЬ: я думаю, что я действительно запрашиваю, утилита Unix, которая может обрабатывать файл (выполнять поиск / замену) как "двоичный", не разбивая его на строки

Ответы [ 2 ]

2 голосов
/ 19 декабря 2008

Основываясь на предложении Патрика , я смог сделать это с помощью Perl:

кошачий файл | perl -pe 's / \ 002 \ n / \ 002 \ 002 / g' | perl -pe 's / \ n / / g' | perl -pe 's / \ 002 \ 002 / \ n / g'

1 голос
/ 19 декабря 2008

Не могли бы вы сделать несколько проходов через файл? Проход 1 преобразует все \ 002 \ n в \ 002 \ 002, скажем. Проход 2 может преобразовать все \ n в пробелы. Проход 3 может преобразовать все \ 002 \ 002 в \ n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...