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 に置き換え、foom4 をfoodefined という名前のマクロで使用します。このマクロは、単に最初の引数を出力し、残りのデータを破棄します。 m4括弧の解析は非常に堅牢であるため、ほとんどの場合、これでうまくいくはずです。foo(囲まれたテキストに が続く文字列が含まれている場合、これは失敗することに注意してください(。 以外の一意の文字列を選択してください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 に答える