使用BASH中的sed查找模式并将其提取到另一个文件中

时间:2009-10-06 10:09:39

标签: bash shell sed

我有一些包含表创建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 个答案:

答案 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