2016-12-20 44 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

@ Mr. Kang涼しいregex101.comサイトを表示していただきありがとうございます。表示されている正規表現は、いくつかの行にまたがるトランザクションレコード全体と一致しませんので、これは私が探していたものとまったく同じではありません。私はpii_keによって与えられたperlソリューションに相当する純粋なregexpソリューションに感謝します。 –

+0

@ Mr.kangあなたが与えたリンクで動作する正規表現に次のようになっています: ^トランザクション+ +ユーザ:\ s(?| build)(。| \ n)+ しかし、次のgrepコマンドを使用して作業してください: grep "^ transaction。+?ユーザー:\ s(?!n)+" test_data.txt –

答えて

2

あなたはOをしたい場合build以外のすべてのユーザーのトランザクション行をNLY:

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

あなたは、このようなユーザーのための全体の取引記録したい場合:grep

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

OR

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

-A-vオプションをすべてのトランザクションレコードの行数が同じであれば、コマンドはそのトリックを完了していました。

+0

を参照してください。これは完全に機能しました!ありがとうございました。純粋なgrepソリューションをお持ちの方は、perlが現在インストールされていないので、共有してください。 –

+0

@FarrukhNajmi同じことをする別のコマンドを追加しました。あなたが 'awk'をインストールしていると便利かもしれません。 –

関連する問題