0

我有多个包含 DDL 和 DML 的 .sql 文件。

1)在一组文件中有一个 DDL(创建表 ...),然后是一个 DML(合并到 ....),然后是一个 DDL(删除表 ...),如下所示:

    CREATE TABLE T1 (col1 ...);
    Merge into T2 using T1.....;
    Drop table T1;

2)在第二组中,上述模式有多个重复:

    CREATE TABLE T1 (col1 ...);
    Merge into T2 using T1.....;
    CREATE TABLE T3 (col1 ...);
    Merge into T4 using T1 and T3.....;
    Drop table T1;
    Drop table T3;

我需要从每个源文件创建 2 个文件:一个包含所有 DDL,另一个包含所有 DML。我尝试过 sed 首先在 CREATE 和分号之间搜索并定向到 DDL 文件,然后在 Merge 和分号之间搜索并定向到 DML 文件,最后在 Drop 和分号之间搜索并附加到上面的 DDL 文件。

    sed -n '/CREATE/,/;/p' $SRCFILE > $TGTDDLFILE
    sed -n '/Merge/,/;/p' $SRCFILE > $TGTDMLFILE
    sed -n '/Drop/,/;/p' $SRCFILE >> $TGTDDLFILE

它适用于第 1 组,但不适用于第 2 组。有没有一种方法可以缩放它以应用于每一次出现,以便它也涵盖第 2 组。如果没有,还有其他方法吗?

感谢你的帮助。谢谢

4

2 回答 2

0

你可以使用类似的东西

    sed -n '/CREATE/p' $SRCFILE > $TGTDDLFILE
    sed -n '/Merge/p' $SRCFILE > $TGTDMLFILE
    sed -n '/Drop/p' $SRCFILE >> $TGTDDLFILE

如果您所引用的文件在一行上有一条 SQL 语句,这将满足您的需求。在一行中有多个 SQL 语句和在多行中有一个 SQL 语句的情况下,它将失败。

如果是这种情况,您也可以使用grep.

    cat $SRCFILE | grep 'CREATE' > $TGTDDLFILE
    cat $SRCFILE | grep 'Merge' > $TGTDMLFILE
    cat $SRCFILE | grep 'Drop' >> $TGTDDLFILE
于 2013-03-25T16:23:44.790 回答
0

原始 sed 脚本中的一个问题是,您告诉 sed 查找以 CREATE 开头并以 ';' 结尾的一系列行。- 当您要求匹配时,sed 不会将单行视为范围,因此它看不到 ';' 当它与 CREATE 在同一行时。

试试这个版本,看看效果更好:

sed -ne 'H;/CREATE/h;/;/{s/.*//;x;/^CREATE/p;}' $SRCFILE > $TGTDDLFILE

第一个命令 (H) 将当前行放入保存空间,无论我们是否需要它(它处理 CREATE 和 ';' 之间的行)。如果该行包含 CREATE,我们用它覆盖保存空间,因此那里的行以 CREATE 开头。现在如果该行包含';' 我们清除当前行并将其与保持空间交换。如果保留空间内容以 CREATE 开头,我们打印它。这里可以清理冗余,但代价是向脚本添加更多内容,所以我没有打扰。除非你有大文件,否则没关系。

于 2013-03-25T19:21:38.720 回答