私の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-behind
pattern
(?=pattern)
look-ahead
答え2
何について:grep -Poz "^:MENU1\K[^:]*"
か。
答え3
@Herbertのソリューションはおそらく最も簡単ですが、ツアーを使用することもできます。
$ grep -Poz '(?<=:MENU1\n)[^:]*' file
0. public
1. admin
2. webmail