2016-04-11 4 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}' 

(JJ Влиятельный) (члены NNS) (IN из) (Д.Т.) (ННП House) (ННП Пути) (CC и) (ННП Средства) (ННП комитет) (ВБД представил) (NN le gislation) (WDT, который) (MD будет) (ограничение VB) (WRB как) (DT) (JJ новый) (NN сбережения и ссуда) (выдача NN) (агентство NN) (MD can) (VB рейз) (капитал NN) (,,) (создание VBG) (DT другой) (потенциал JJ) (препятствие NN) (TO to) (DT) (правительство NN) (POS) (NN) продажа) (IN of) (JJ больной) (NNS бережливость) (. .)

+0

Приятно, но он игнорирует первую скобку (JJ Влиятельный) – 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

Есть ли способ, чтобы держать вещи в одной и той же линии, что они были найдены в тексте? Это выплескивает их как один (aaa aaa) в каждой строке/ – user3639557

+0

Может ли входной файл содержать несколько строк, или все это в одной строке? –

+0

Он содержит несколько строк. Я обновил вопрос с помощью фрагмента данных. – user3639557

0

С GNU AWK для FPAT все что вам нужно это:

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

например:

$ 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) (. .) 

С другими awks было бы просто быть 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'

Смежные вопросы