2016-04-11 16 views
1

私は各スコープの唯一の最も内側のオープン&閉じ括弧のペアがキャプチャされている次のシーケンスには、この中括弧の中身を抽出していますか?

(TOP (S (NP (NP (JJ Influential) (NNS members)) (PP (IN of) (NP (DT the) (NNP House) (NNP Ways) (CC and) (NNP Means) (NNP Committee)))) (VP (VBD introduced) (NP (NP (NN legislation)) (SBAR (WHNP (WDT that)) (S (VP (MD would) (VP (VB restrict) (SBAR (WHADVP (WRB how)) (S (NP (DT the) (JJ new) (NN savings-and-loan) (NN bailout) (NN agency)) (VP (MD can) (VP (VB raise) (NP (NN capital)))))) (, ,) (S (VP (VBG creating) (NP (NP (DT another) (JJ potential) (NN obstacle)) (PP (TO to) (NP (NP (NP (DT the) (NN government) (POS 's)) (NN sale)) (PP (IN of) (NP (JJ sick) (NNS thrifts)))))))))))))) (. .))) 
(TOP (S (NP (DT The) (JJ interest-only) (NNS securities)) (VP (VBD were) (VP (VBN priced) (PP (IN at) (NP (QP (CD 35) (CD 1\/2)))) (S (VP (TO to) (VP (VB yield) (NP (CD 10.72) (NN %))))))) (. .))) 
(TOP (S (NP (EX There)) (VP (VBD were) (NP (DT no) (JJ major) (NNP Eurobond) (CC or) (JJ foreign) (NN bond) (NNS offerings)) (PP (IN in) (NP (NNP Europe))) (NP (NNP Friday))) (. .))) 

を変換したい:ない括弧のセットのための

(JJ Influential) (NNS members) (IN of) (DT the) (NNP House) (NNP Ways) (CC and) (NNP Means) (NNP Committee) (VBD introduced) (NN legislation) (WDT that) (MD would) (VB restrict) (WHADVP (WRB how) (DT the) (JJ new) (NN savings-and-loan) (NN bailout) (NN agency) (MD can) (VB raise) (NN capital) (, ,) (VBG creating) (DT another) (JJ potential) (NN obstacle) (TO to) (DT the) (NN government) (POS 's) (NN sale) (IN of) (NP (JJ sick) (NNS thrifts) (. .) 
(DT The) (JJ interest-only) (NNS securities) (VBD were) (VBN priced) (IN at) (CD 35) (CD 1\/2) (TO to) (VB yield) (CD 10.72) (NN %) (. .) 
(EX There) (VBD were) (DT no) (JJ major) (NNP Eurobond) (CC or) (JJ foreign) (NN bond) (NNS offerings) (IN in) (NNP Europe) (NNP Friday) (. .) 

答えて

1

一致の行番号を印刷して、awkが行に結合するようにすることができます

$ grep -oPn "\([^()]*\)" line | 
    awk -F: 'p==$1{a=a OFS $2} p!=$1{if(NR>1)print a;a=$2;p=$1} END{print a}' 

(のIN)(JJ影響力)(NNSメンバー)(DT)(NNPハウス)(NNP方法) (CCと)(NNP手段)(NNP委員会)(VBDが導入されました) (NNの救済措置)(NNの救済機関)(MD缶詰)(MD缶詰)(NBの救済) (NN支配)(NN支配)(NN支配)(NN支配)(NN支配)販売)(の中で )(JJ病気)(NNSの倹約)(。 。FPATのためのGNUのawk付)

+0

いいえ、最初のかっこ(JJ Influential) – user3639557

+1

はい、無視します。 'NR> 1'の間違った箇所が修正されました。 – karakfa

+0

内部の括弧の中に ':'が現れると失敗します。 –

1

ルック内部には他の括弧が含まれています。

egrep -o '\([^()]*\)' 

同じ行に結果を保つために、あなたができる:

while read line; do 
    egrep -o '\([^()]*\)' <<< "$line" | tr '\n' ' ' 
    echo 
done 

やPerlを使用して:

perl -e 'while(<>) { my @m = $_ =~ /\([^()]*\)/g; print "@m\n" }' 

(そこに簡単な方法であること、しかし、私はしなければなりません空白を描く)

+0

彼らはテキストで見つかったのと同じラインで物事を維持する方法はありますか?これは、各行で1つ(aaa aaa)としてそれらを吐き出す/ – user3639557

+0

入力ファイルは複数の行を含むことができますか、それはすべて1行にありますか? –

+0

複数の行が含まれています。質問をデータスニペットで更新しました。 – user3639557

0

あなたが必要とするすべては次のとおりです。

awk -v FPAT='[(][^()]*[)]' '{$1=$1}1' file 

例:他のawksで

$ awk -v FPAT='[(][^()]*[)]' '{$1=$1}1' file 
(JJ Influential) (NNS members) (IN of) (DT the) (NNP House) (NNP Ways) (CC and) (NNP Means) (NNP Committee) (VBD introduced) (NN legislation) (WDT that) (MD would) (VB restrict) (WRB how) (DT the) (JJ new) (NN savings-and-loan) (NN bailout) (NN agency) (MD can) (VB raise) (NN capital) (, ,) (VBG creating) (DT another) (JJ potential) (NN obstacle) (TO to) (DT the) (NN government) (POS 's) (NN sale) (IN of) (JJ sick) (NNS thrifts) (. .) 
(DT The) (JJ interest-only) (NNS securities) (VBD were) (VBN priced) (IN at) (CD 35) (CD 1\/2) (TO to) (VB yield) (CD 10.72) (NN %) (. .) 
(EX There) (VBD were) (DT no) (JJ major) (NNP Eurobond) (CC or) (JJ foreign) (NN bond) (NNS offerings) (IN in) (NNP Europe) (NNP Friday) (. .) 

それだけwhile(match())ループになるだろう:

$ awk '{r=""; while (match($0,/[(][^()]*[)]/)) {r=r (r?OFS:"") substr($0,RSTART,RLENGTH); $0=substr($0,RSTART+RLENGTH)} print r}' file 
(JJ Influential) (NNS members) (IN of) (DT the) (NNP House) (NNP Ways) (CC and) (NNP Means) (NNP Committee) (VBD introduced) (NN legislation) (WDT that) (MD would) (VB restrict) (WRB how) (DT the) (JJ new) (NN savings-and-loan) (NN bailout) (NN agency) (MD can) (VB raise) (NN capital) (, ,) (VBG creating) (DT another) (JJ potential) (NN obstacle) (TO to) (DT the) (NN government) (POS 's) (NN sale) (IN of) (JJ sick) (NNS thrifts) (. .) 
(DT The) (JJ interest-only) (NNS securities) (VBD were) (VBN priced) (IN at) (CD 35) (CD 1\/2) (TO to) (VB yield) (CD 10.72) (NN %) (. .) 
(EX There) (VBD were) (DT no) (JJ major) (NNP Eurobond) (CC or) (JJ foreign) (NN bond) (NNS offerings) (IN in) (NNP Europe) (NNP Friday) (. .) 
0

改行のプレースホルダを設定してから、 grep誘発改行を削除し、sedバックプレースホルダを切り替える:

sed 's/.$/&_NL/g' file | grep -oP "\([^()]*\)" | tr -d '\n' | sed 's/_NL/\n/g'

関連する問題