2016-08-19 9 views
0

egrepは次の例では一致しません。私が達成しようとしているのは、'{% +'です。私のマークダウンファイルのすべての{% %}括弧に一致しています。私の現在の理解から、それに続いて{%に一致するはずですが、スペースがなければ一致しません。私はPowerShellで同じ表現を使用することができ、それが一致するので、私はそれが何か不足しているのだろうかと思っています。予想通りegrep +定量器が動作しない

スニペット私にとって

{% highlight ruby %} 
{% endhighlight %} 

cat file.md | egrep '{% +' 
+1

が '' *数量詞と '' +数量詞を置き換える:

明らかに、あなたは以下を使用して、あなたが期待する結果を得ることができる必要があります。何が問題ですか? –

+0

*は機能しますが、スペースを使用することもできません。スペースを確保するにはどうすればいいですか?私はそれが何をするのですが、うまくいかないようです。 – duffney

+0

'+'を削除して、動作しているか確認してください。 1つ以上一致する必要があるため、量指定子は冗長です。 1の場合、 '' {% ''は既に十分です。また、スペースではなくタブがあるかもしれません。リテラルスペースの代わりに '[[:blank:]]'を試してください。 –

答えて

1

と照合する、あなたの正規表現は動作します。私は(UUoCを避けて)あなたのコマンドを実行すると

{% highlight ruby %} 
{% endhighlight %} 
not this line, though 
nor {%this%} 

、私は出力を示します:入力ファイルfile.md含む考える

$ egrep '{% +' file.md 
{% highlight ruby %} 
{% endhighlight %} 
$ 

をあなたが使用しているegrepのバージョンを特定していませんでしたし、どのプラットフォームを使用しているかを示します。私はMac OS X 10.11.6を使っていて、egrep (BSD grep) 2.5.1-FreeBSDを使っています(しかし、私はGNU Grep 2.25でも同じ結果になります)。

{egrepのメタ文字であり、期待通りに最初の{を処理していない可能性があることに注意してください。私は最初と最後の括弧をエスケープするバックスラッシュを使用

$ egrep '\{% {1,4}[a-z]{4,20} {1,4}%\}' file.md 
{% endhighlight %} 
$ 

例えば、ここでの唯一のendhighlight行を選択する必要があり、より複雑なegrep呼び出しがあります。 {n,m}という表記法は、上記の正規表現(空白および[a-z])のn≤x≤mの一致を意味します。を意味します。 ,mは省略できます。 {4,}を使用することもできます - これらを理解するにはマニュアルをチェックしてください。しかし、私のマシン上で、私も実行することができます。おそらく

$ egrep '{% {1,4}[a-z]{4,20} {1,4}%}' file.md 
{% endhighlight %} 
$ 

を、最初{{n,m}シーケンスを開始しないので、それは通常の文字として扱われます。

あなたはExtended Regular ExpressionsのためのPOSIX仕様を見れば、あなたはそれがそのような{を使用すると、未定義の動作であると言うことがわかります:

*+?{

<asterisk><plus-sign><question-mark>、および<left-brace>条ブラケット式(REブラケット式を参照)で使用される場合を除いては、特別なものにしてください。これらの文字は、EREに最初に表示される、または<left-brace>が有効な区間の一部でない場合は、直ちに<vertical-line><circumflex>、または<left-parenthesis>

  • を以下の場合は

    • :以下の用途のいずれかが未定義の結果を生み出します式は、(のEREは、複数の文字を見るマッチ)

  • ので、POSIXによると、あなたはそのP正規表現を使用しています未定義の結果が得られます。したがって、POSIXが受け入れられると判断した結果が得られます。この場合

    $ egrep '\{% +' file.md 
    {% highlight ruby %} 
    {% endhighlight %} 
    $ 
    
    +0

    {と}のエスケープ "\"文字を使用することで、+量子を期待通りに機能させることができました。私はそれがメタキャラクターであることを指摘してくれてありがとう。なぜそれが以前にはうまくいかなかったのか、それは完全な意味があります。私はまた、長くて詳細なコメントに感謝します。ありがとうございました。 – duffney

    関連する問題