我有一些包含表创建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);
答案 0 :(得分:2)
您没有确切地说sed
脚本如何处理第二个SQL脚本,但我会假设它打印所有行。
当我针对两个SQL脚本运行它时,它似乎正常工作。仅输出带有alter table
的{{1}}语句。
对于我可能出错的第一个线索是两个SQL脚本的格式不同。有大写字母,不同的布局,斜线与分号,加上可能的流浪“\ r”。
所以我在第二个SQL脚本上运行foreign keys
并再次运行unix2dos
脚本。这次它输出所有行。
因此,要解决您的问题,请尝试相反:
sed
修改强>:
为了修改原始SQL文件并将带有dos2unix sqlscriptname
的{{1}}语句保存到名为alter table
的文件中,您可以这样做:
foreign keys
这会保留原始SQL脚本,但删除了语句后,将未更改的脚本备份到foreign.out
并将语句写入 sed -i.bak -e '/./{H;$!d;}' -e 'x;/foreign/w foreign.out' -e '/foreign/d' sqlscriptname
。
答案 1 :(得分:1)
未测试:
perl -e '$/=""; while(<>) { print if / references /; }' all.sql > references.sql
停止搞乱sed。
答案 2 :(得分:0)
我最初的想法是分两步完成:
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语句。
[编辑以更正格式化]
答案 3 :(得分:0)
以下脚本为我做了诀窍
#!/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