2016-12-20 60 views
0

我想過濾掉一組匹配使用正則表達式的模式的行,但在獲取正確的正則表達式時無法使用。如何匹配一組匹配模式的行

文本文件包含這樣的線路:

transaction 390134; promote; 2016/12/20 01:17:07 ; user: build 
    to: DEVELOPMENT ; from: DEVELOPMENT_BUILD 
    # some commit comment 
    /./som/file/path 11745/409 (22269/257) 

    # merged 
    version 22269/257 (22269/257) 
    ancestor: (22133/182) 

transaction 390136; promote; 2016/12/20 01:17:08 ; user: najmi 
    to: DEVELOPMENT ; from: DEVELOPMENT_BUILD 
    /./some/other/file/path 11745/1 (22269/1) 

    version 22269/1 (22269/1) 
    ancestor: (none - initial version) 
    type: dir 

我想篩選出以「交易」開始的行,包含「用戶:建一路,直到開頭的下一行」交易」。

的想法是結束了交易,其中行用戶不‘建’。

感謝您的幫助。

+0

你想要這個嗎? https://regex101.com/r/DOeWXt/1 –

+0

@康先生感謝您展示酷酷的regex101.com網站。正如所示的正則表達式不匹配跨越多行的整個事務記錄,所以這不是我正在尋找的。我會感謝一個純粹的正則表達式解決方案,它相當於pii_ke給出的perl解決方案。 –

+0

@ Mr.kang我得到了下面的正則表達式在你給的鏈接中工作: ^ transaction。+?user:\ s(?!build)(。| \ n)+ 但是,使用以下grep命令: grep「^ transaction。+?user:\ s(?!build)(。| \ n)+」test_data.txt –

回答

2

如果你想Ø NLY所有用戶的交易行除了build

grep '^transaction ' test_data| grep -v 'user: build$' 

如果你想爲這些用戶全部交易記錄:

awk '/^transaction /{ p = !/user: build$/};p' test_data 

OR

perl -lne 'if(/^transaction /){$p = !/user: build$/}; print if $p' test_data 

grep-A-v選項如果所有交易記錄具有相同的行數,命令就可以做到這一點。

+0

這工作完美!謝謝。如果任何人有一個純粹的grep解決方案,請分享,因爲perl目前沒有爲我們安裝。 –

+0

@FarrukhNajmi我已經添加了另一個命令,可以做同樣的事情,如果你安裝了'awk',可能會證明是有用的。 –