2015-09-15 69 views
1

我正在尋找一個快速簡單的單行提取所有大括號分隔的文本塊,其中包含文本文件中的搜索字符串。我只是把自己搞糊塗了,但每個人似乎都只是在沒有搜索字符串的情況下在大括號之間發送文本。如何在包含特定搜索字符串的兩個大括號之間獲得多行字符串?

我有與內容的大的文本文件是這樣的:

blabla 
blabla { 
    blabla 
} 
blabla 
blabla { 
    blabla 
    blablaeventblabla 
} 
blabla 

絕大多數括號項不包含搜索字符串,這是「事件」。

我想要提取的是每個花括號之間的所有文本(特別是包括多行匹配),但只有當所述文本也包含搜索字符串時。所以這樣的輸出:

blabla { 
    blabla 
    blablaeventblabla 
} 

我的Linux命令行是/ usr/bin/bash。我一直在嘗試不同的grep和awk命令,但就是無法得到它的工作:

awk '/{/,/event/,/}/' filepath 

grep -iE "/{.*event.*/}" filepath 

我想這將是很容易的,因爲它是一個共同的任務。我在這裏錯過了什麼?

回答

1

這GNU-AWK應該工作:

awk -v RS='[^\n]*{|}' 'RT ~ /{/{p=RT} /event/{ print p $0 RT }' file 
blabla { 
    blabla 
    blablaeventblabla 
} 

RS='[^\n]*{\n|}'組輸入記錄分隔符的任何文本,然後{}RT是根據RS正則表達式設置爲匹配文本的內部awk變量。

+1

這隻要運作良好的匹配捲曲大括號不在同一行。另一個答案處理這種情況(用戶9999999..9消失的那個)。 我看到,如果我想要理解這個答案,我將不得不在awk上閱讀很多內容。也許今晚。 – leu

+0

查看已更新的答案以允許在同一行上使用「{」和「}」。 – anubhava

+1

謝謝anubhava,效果很棒!接受爲答案。 當然,這個答案與格式錯誤的情況下的其他答案有相同的警告(如嵌套的花括號或缺少匹配的大括號)。 – leu

1

用戶999999999999999999999999999999使用sed有一個很好的答案,我真的很喜歡,不幸的是他們的答案由於某種原因似乎已經消失。

這是爲那些誰可能會感興趣:

sed '/{/{:1; /}/!{N; b1}; /event/p}; d' filepath

說明:

/{/ if current line contains {then execute next block { start block :1; label for code to jump to /}/! if the line does not contain} then execute next block { start block N; add next line to pattern space b1 jump to label 1 }; end block /event/p if the pattern space contains the search string, print it (at this point the pattern space contains a full block of lines from {to} ) }; end block d delete pattern space

+0

任何使用此方法的人請注意,如果文件格式不正確(如缺少大括號或大括號的嵌套塊),結果可能會出乎意料。 – leu

相關問題