2017-11-03 3 views
1

このタイプの検索はここでいくつかの他の質問のアドレスになっていますが、なんらかの理由で私のシナリオでは動作しません。2行でパターンを検索するときの正規表現に関する問題

some text here done 
12345678_123456 226- 
more text 
some more text here done 
12345678_234567 226- 

私は16の文字が進むと、doneは、次の行に226-が続いているすべてのケースを見つけようとしている:
は、私は次のパタパタのようなものが含まれているテキストファイルを持っています。私はgrep -Pzopcregrep -Mを試しましたが、何も返されません。

2行と16文字を考慮して、正規表現の複数の組み合わせを試しました。

grep -Pzo '(?s)done\n.\{16\}226-' filename 

関連記事:これは私がgrepと試みた例の一つである

+1

R '\行わ{16} 226-。' 'grepの-Pzoを試してみてくださいfilename'や' grepの-Pzo '(mは?)R \行わ{16} 226 - 。$' ' –

答えて

0

あなたは{}しばらく脱出してはなりません米国(PCRE)オプションのgrepにあります。そのエスケープはBREのためだけです。

あなたは使用することができます。

grep -ozP 'done\R.{16}226-\R' file 

done 
12345678_123456 226- 
done 
12345678_234567 226- 

\Rは、任意のUnicode改行文字にマッチします。あなただけ\nを扱っている場合は、あなただけ使用することができます:文字列の末尾226-後\nを必要とすることは悪いことですので

grep -ozP 'done\n.{16}226-\n' file 
+1

あなたはどのくらいの時間を無駄にしてしまったのか分からず、 '{' '}をエスケープしないと思ったことはありません。 – slybloty

+0

@slyblotyエスケープは難しく、さまざまなRegex言語で動作が異なります。 Perlの場合、単純なルールがあります。「エスケープされた句読記号はすべてリテラルとして解釈され、エスケープされていない英数字はリテラルとして解釈されます。 'grep'、' egrep'、 'vim'などはこの基本ルールからさまざまな範囲に逸脱しています。あなたがそれらを使用する必要がある場合は、特定の例外を覚えるだけです。 – jpaugh

1

この(?m)done$\s+.*226-$

にそれを一般化します。
226の後に\nを必要としないことも悪いことです。
したがって、パラドックスは(\n|$)で解決されますが、なぜ\nで解決されますか?

両方の問題は複数行と$で解決されました。

https://regex101.com/r/A33cj5/1