2016-07-08 2 views
0

Используя терминал на Mac OSX (iTerm2) без внешних приложений, кроме postgres, я хочу запустить некоторое регулярное выражение для поиска/замены в довольно большом (52 МБ) файле данных pg_dump, поскольку он импортируется в базу данных PostgreSQL. Мне нужно сделать это, прежде чем файл дампа попадет в PostgreSQL, потому что мне нужно преобразовать входящие SQL-запросы, которые создают и изменяют таблицы.Как запустить фильтр по данным pg_dump во время импорта?

Команда оболочки Я использую для импорта данных является:

psql MyDatabase < mydata.sql 

Есть ли способ трубы данные через регулярные выражения поиска/замены фильтра? Могу ли я что-то сделать с родными утилитами командной строки Linux, такими как grep?

В качестве альтернативы, как бы я мог выгружать мои регулярные выражения и применять их к моему дамп-файлу, а затем сохранить изменения в новый файл?

+0

Вопрос на данный момент абсолютно бесполезен. Скажите 'regex find/replace' что? Проведя здесь время, вы не знаете, что делает [\ [mcve \]] (http://stackoverflow.com/help/mcve)? – sjsam

+0

@sjsam Я понятия не имею, что вы имеете в виду. – Redtopia

+0

Пожалуйста, отредактируйте вопрос, добавив информацию о 'pattern', который вы хотите заменить, и' new pattern'. Также подумайте о том, чтобы добавить инструменты, которыми вы располагаете, например 'sed'' awk' и так далее. – sjsam

ответ

2

Вы можете использовать sed, который понимает регулярные выражения.

Например, чтобы заменить все вхождения «MySchema», которые окружены границами слова с «anotherschema», вы можете использовать:

sed -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql | psql MyDatabase 
+0

Я попробую. Что делать, если у меня есть несколько регулярных выражений? Есть ли способ выполнить их все сразу? – Redtopia

+1

Несомненно. Просто поставьте несколько опций '-e'. –

+0

Спасибо за совет sed. По-видимому, если вы не используете свои Linux-команды, вы не терпите вопросов. Если вы чувствуете, что мой вопрос не был глупым, возможно, вы можете его перенести. Благодаря! – Redtopia

1

В качестве альтернативы, как бы я партия моих регулярных выражений и применять их в мой дамп и сохраните изменения в новом файле?

sed -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql >mysqlnew.sql 

Это перенаправляет вывод в новый файл с именем mysqlnew.sql.

Обратите внимание, что sed поддерживает возможность редактирования на месте. Использование INPLACE опции редактирования -i, вышеприведенная команда может быть заменена

sed i.bak -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql 

Эта команда делает копию оригинального mydata.sql в mydata.sql.bak и делает эти изменения, написанные в mydata.sql.