perl脚本从包含关键字的文件中搜索sql语句

时间:2013-05-03 07:34:22

标签: perl

我正在尝试在.sql文件中搜索sql语句,该语句以 CREATE TABLE 开头,后跟字段值,然后是关键字[ TB_DATA和TB_INDX ],以<结尾强>

喜欢

CREATE TABLE HDTB_CODE (IDPK VARCHAR(256) NOT NULL) IN TB_DATA INDEX IN TB_INDX;

.sql文件语句有多行

CREATE TABLE HDTB_CODE
(
IDPK VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;

--CREATE TABLE HDTB_BYTE
(
RTID VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
DROP TABLE HDTB_BYTE;
CREATE TABLE HDTB_RES
(
ARTID VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
CREATE TABLE HDTB_DE
(
IDPK VARCHAR(256) NOT NULL
);

-------------output----------------------

CREATE TABLE HDTB_CODE
(
IDPK VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;

CREATE TABLE HDTB_RES
(
ARTID VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;

2 个答案:

答案 0 :(得分:1)

试试这个:

use strict;
use warnings;

my $filename = 'somefile.sql';
open(my $fh, '<', $filename) || die "unable to open '$filename' for read; $!";

local $/ = "";     # Paragraph mode
while (<$fh>) {
    if (/^CREATE TABLE.+TB_DATA.+TB_INDX/s) {
        print   # or do something else
    }
}

close $fh;

$/中使用空字符串标记“段落模式”,这意味着记录分隔符是两行(或更多)新行,因此它在空行上打破(如果不是这样的话) ,那么你可以使用“; \ n”)。

s需要正则表达式后的.修饰符才能匹配新行。

答案 1 :(得分:0)

use strict;
use warnings;

$/ = '';
print grep { $_ =~ /CREATE TABLE/ && $_ =~ /INDEX/} <>;

或者:

$/ = '';
print grep { /^CREATE TABLE.+TB_DATA.+TB_INDX/s} <>;

用法:

script_name.pl sql_file