2017-09-20 52 views
2

如何通過正則表達式對helloworld(...)中只包含'.get'擴展名的行的文件進行grep?無法理解括號中的正則表達式

a(text) 

b(text) 

helloworld(
text.get 
text.get 
text.get 
text.get 
) 
c(text) 

然後,例如像這樣:

a(text) 

b(text) 

helloworld(
text.pass 
text.pass 
text.pass 
text.pass 
) 
c(text) 

不應該被發現

我想正則表達式[a-z_]+\.get,但它有助於找到與擴展名的文件,但我不知道如何用helloworld(包裝並以)

+0

'grep'比賽逐行。你不能匹配多行 – Toto

+0

這取決於。我想查找包含helloworld和.get的文件。我認爲多線支持並不重要。你怎麼看? – vladiqtx

+1

要打印包含helloworld和.get的文件的名稱將是'awk'/ helloworld/{a = 1} /\.get/{b=1} END {if(a && b)print FILENAME}'*'。那是你在找什麼? –

回答

2

如果你有gnu grep那麼你可以使用-z選項來對待,而文件的行序列,並使用此命令可以列出匹配塊:

grep -zoP 'helloworld\s*\(\s*(\w+\.get\b\s*)+\)\s*' file 

要列出目錄中使用的所有匹配的文件:

grep -zPl 'helloworld\s*\(\s*(\w+\.get\b\s*)+\)\s*' file* 
1

結束AKAIK grep一次只能作一條線。

這Perl的一個班輪你想要做什麼:對第一個文件

perl -0777 -ne 'print $& if /helloworld\(\R(?:[a-z_]+\.get\R)+\)/' file 

結果:

helloworld(
text.get 
text.get 
text.get 
text.get 
) 

結果的第二個文件:

NOTHING 
+0

我從來沒有碰過perl :(有沒有可能爲一個目錄實現這個目標並計算像'wc -l'這樣的結果呢? – vladiqtx