0

我正在尝试提取文件中第一个与其匹配的右括号之间的文本。

输入

CREATE MULTISET TABLE ABCD.EFGH,
NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = Default
( ABCK_SK      INTEGER         NOT NULL,
PRQ  VARCHAR(1024)           NOT NULL,
RST   DECIMAL (12,4)          NOT NULL,
LMN     CHAR(1)         NOT NULL,
OPQ      DATE            NOT NULL,
PQRS     DATE            NOT NULL,
TUV       INTEGER         NOT NULL,
WXY        INTEGER         NOT NULL
)  UNIQUE PRIMARY INDEX ABCK_PI (ABCK_SK)
;

预期产出

ABCK_SK      INTEGER         NOT NULL,
PRQ  VARCHAR(1024)           NOT NULL,
RST   DECIMAL (12,4)          NOT NULL,
LMN     CHAR(1)         NOT NULL,
OPQ      DATE            NOT NULL,
PQRS     DATE            NOT NULL,
TUV       INTEGER         NOT NULL,
WXY        INTEGER         NOT NULL

我编写了以下脚本,用于从需要提取文本的位置获取行号和列号,但我无法实际打印输出。任何建议将不胜感激。谢谢

#!/bin/sh
nawk 'BEGIN{startln=0;j=0;i=0;endln=0;startchr=0;endchr=0} {
i=1; while( i<=NF ) {
if($i=="(" && startln==0 ){startchr=i; startln=NR} 
if($i==")"){j=j-1} 
if($i=="("){j=j+1} 
if(j==0){endchr=i;endln=NR;break} 
 i=i+1}} 
END{
print "startln="startln " startchr="startchr " endln="endln " endchr="endchr}' $1
4

3 回答 3

0

这是提取第一个匹配括号中包含的数据的好方法:

sed -n -e '1,/(/s/[^(]*/foo/' -e '/(/,$p' input-file | m4 -D 'foo=$* m4exit(0)'

sed 将第一个打开括号之前的所有文本替换为 text foo,然后将 m4 与名为foodefined 的宏一起使用,该宏仅输出其第一个参数,然后丢弃剩余的数据。 m4对括号进行了非常强大的解析,所以这应该适用于大多数情况。(请注意,如果您包含的文本包含foo后跟 a的字符串,这将失败(。请选择一些除 之外的唯一字符串foo。)

于 2012-07-26T17:13:37.457 回答
0

用法:
awk -f foo.awk foo.txt

foo.awk

BEGIN {
    ORS=""
    RS="[()]"
}

RT=="(" {
    s++;
    if (s>1) print $0 RT
}


RT==")" {
    s--;
    if (s==0) {
      print $0 "\n"
      exit
    } else {
      print $0 RT
    }
}
于 2012-07-26T18:10:42.573 回答
0

perl 解决方案:

perl -e '$/=\1;
    while(<>) {
        if( /\)/ ) { $c -=1; exit unless $c }
        print if $c > 0;
        $c += /\(/
    }' input-file
于 2012-07-26T18:20:09.693 回答