grep正規表現ソリューション(貪欲は機能しません)

grep正規表現ソリューション(貪欲は機能しません)

私のdata.txtファイルには次のテキストがあります。

:MENU1
0. public
1. admin
2. webmail

:SYNTAX
! opt1, ... :

:ERROR1
Error #1, blah... blah.. blah...
Please do ...

:ERROR2
Error #2 ...

:MENU1正規表現(PERL構文)を使用して次の最初の部分を抽出し、結果から最後の部分を:削除したいと思います。MENU1:

いくつかの正規表現を試しましたが、最も近い解決策では「欲張りな」オプションを使用することもできず、最後の「:」も捨てることができませんでした。

grep -Poz "^:MENU1\K[\w\W]*:"

これはgrepで動作しますが、すべて のテキストを最後の「:」
まで取得します。
:MENU1

0. public
1. admin
2. webmail
 

(先端の空白行に注意してください)

答え1

このパターンは*:最後のパターンまですべてと一致します:。次の:場所で止まる*?:。たとえば、

% grep -Poz '^:MENU1\K[\w\W]*?:' data.txt 

0. public
1. admin
2. webmail

:

前に改行文字を一致させることで、最初の行を削除できます\K。たとえば、

% grep -Poz '^:MENU1\n\K[\w\W]*?:' data.txt 
0. public
1. admin
2. webmail

:

空白行を食べるには、:テキストを一致させて捨てることができます。たとえば、

% grep -Poz '^:MENU1\n\K[\w\W]*?(?=\n+:)' data.txt 
0. public
1. admin
2. webmail

次に、以下を除くすべての項目と一致するように文字クラスを単純化できます:

% grep -Poz '^:MENU1\n\K[^:]*?(?=\n+:)' data.txt 
0. public
1. admin
2. webmail

最後に、一致の初期部分を書き換えることができます。

% grep -Poz '(?<=:MENU1\n)[^:]*?(?=\n+:)' data.txt 
0. public
1. admin
2. webmail

これは@terdonのアイデアに似ていますが、grepを再度呼び出すことなく空行を処理します。

究極の正規表現エクスプロイト周りを見てくださいパラドックス。これは一致は可能ですが、出力には含まれないようにするアサーション(?<=pattern)です。これは、出力に含めずに後続のパターンを一致させることができるアサーションです。look-behindpattern(?=pattern)look-ahead

答え2

何について:grep -Poz "^:MENU1\K[^:]*"か。

答え3

@Herbertのソリューションはおそらく最も簡単ですが、ツアーを使用することもできます。

$ grep -Poz '(?<=:MENU1\n)[^:]*' file 
0. public
1. admin
2. webmail
  

関連情報