0

我正在尝试在 .sql 文件中搜索以CREATE TABLE开头的 sql 语句,然后是字段值,然后是关键字 [ 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;
4

2 回答 2

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正则表达式后面的修饰符是匹配换行符所必需的.

于 2013-05-03T08:13:21.530 回答
0
use strict;
use warnings;

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

或者:

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

用法:

script_name.pl sql_file

于 2013-05-03T08:07:05.120 回答