Поиск шаблона и извлечение его в другой файл с использованием sed в BASH - PullRequest
1 голос
/ 06 октября 2009

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

Например, ниже приведен один скрипт.

CREATE TABLE x (
    ORG_ID  NUMBER primary key,
    BILLING_doc xmltype
);

alter table x
 add (constraint fk_x foreign key
  (org_id) references organization\r
  (org_id))
/

Я хочу удалить инструкцию alter table, ссылающуюся на оператор внешнего ключа и положить его в другой файл. Как вы видите утверждение заканчивается на /. Некоторые файлы заканчиваются точкой с запятой.

Я хочу сделать это, используя sed . Обратите внимание, что оператор alter показанное здесь разбросано по линиям и не на одном линия.

Любая помощь приветствуется.

Во время работы я обнаружил следующее, но оно работает не для всех сценариев:

sed -e '/./{H;$!d;}' -e 'x;/foreign/!d;' myfile.sql

Скрипт, в котором вышеприведенная команда не работает:

create table io_template
(
    io_template_id number,
    io_template_name varchar2(50),
    acl_id number,
    org_id number,
    is_active varchar2(1),
    xsl_template varchar2(50),
    email_body varchar2(2000),
    purpose varchar2(50) default 'CUSTOMER' not null,
    content_type varchar2(50) default 'PDF' not null
);

alter table _io_template add constraint io_template_pk
      primary key (io_template_id);

alter table _o_template add constraint io_template_acl_fk
      foreign key (acl_id) references scum_acl(acl_id);

alter table io_template add constraint io_template_org_fk
      foreign key (org_id) references scum_organization(org_id);

alter table io_template add constraint io_template_name_uk
      unique (org_id, _io_template_name);

Ответы [ 4 ]

2 голосов
/ 06 октября 2009

Вы точно не скажете, как сценарий sed не работает со вторым сценарием SQL, но я собираюсь предположить, что он печатает все строки.

Когда я запускаю его для обоих сценариев SQL, кажется, что он работает правильно. Выводятся только операторы alter table с foreign keys.

Первая подсказка для меня, что может быть неправильным, заключается в том, что формат двух сценариев SQL различен. Здесь есть заглавные буквы, разная раскладка, косая черта и точка с запятой, а также возможное отклонение "\ r".

Итак, я запустил unix2dos на втором скрипте SQL и снова запустил скрипт sed. На этот раз выводятся все строки.

Итак, чтобы решить вашу проблему, попробуйте сделать наоборот:

dos2unix sqlscriptname

Редактировать

Чтобы изменить исходный файл SQL на месте и сохранить операторы alter table с foreign keys в файле с именем foreign.out, вы можете сделать это:

 sed -i.bak  -e '/./{H;$!d;}' -e 'x;/foreign/w foreign.out' -e '/foreign/d' sqlscriptname

Это оставляет оригинальный сценарий SQL на месте, но с удаленными операторами, создает резервную копию неизмененного сценария в sqlscriptname.bak и записывает инструкции в foreign.out.

1 голос
/ 06 октября 2009

Непроверенные:

perl -e '$/=""; while(<>) { print if / references /; }' all.sql > references.sql

Хватит возиться с седом.

0 голосов
/ 06 октября 2009

Приведенный ниже скрипт помог мне

#!/bin/bash
for filename in `ls *.sql`
do
dos2unix $filename
sed -e '/./{H;$!d;}' -e 'x;/[fF][oO][rR][eE][iI][gG][nN]/!d;' $filename >> fk_file.sql
sed -e '/./{H;$!d;}' -e 'x;/[fF][oO][rR][eE][iI][gG][nN]/d' $filename > $filename.new
mv $filename.new $filename
done
0 голосов
/ 06 октября 2009

Моя первоначальная мысль - сделать это в два этапа:

1. используйте grep, чтобы вытащить шаблон и поместить его в отдельный файл

2. используйте sed, чтобы удалить его из исходного файла

но вполне может быть и лучший способ.

grep -i "alter.*foreign key.*[\/|;]" filename.txt > alter_statements.txt

sed  -e "/alter.*foreign key.*[\/|;]/d" filename.txt > everything_else.txt

Это будет работать только для операторов alter в одной строке.

[отредактировано для правильного форматирования]

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