可能な結果のためのGrep

可能な結果のためのGrep

可能な一致を見つけようとしています。

ex****e

それでは、exで始まり、eで終わり、その間に4つの文字がある項目はどうなりますか?

答え1

単一文字に一致する正規表現演算子はです.。これは?シェルのワイルドカードに似ています。*それ自体は、正規表現の以前のコンテンツの数に関係なく(s(0を含む)の数a*に関係なくa)、シェルワイルドカードの文字数と一致します。

POSIXlyでxeと正確に一致する行を見つけます。

grep -xE 'ex.{4}e'

または:

grep -x ex....e

または:

grep -x 'ex.\{4\}e'

二つ目は、最も携帯性の良いものです。grep '^ex....e$'これはUnixバージョン4(1973)の元の実装でも機能しますが、-xUnixバージョン7(1979)に追加され、一般化されたので信頼できます。

egrepV7には拡張正規表現も追加されましたが、最初はインターバル{x,y}演算子はありませんでした。この演算子が\{x,y\}追加されましたが、以前のバージョンとの互換性が損なわれる可能性があるため、通常はgrep追加されません。egrepしかし、90年代初めに、POSIXは-E機能をマージしてサポートを必要とするオプションを導入しましたが、今は廃止されました。grepegrepgrep{x,y}egrep

ただし、まだ時々grepサポートされていない実装-EやSolarisなどのサポートされてegrepいない実装(代わりに使用する必要がある)を見つけることができます。{x,y}/bin/grep/bin/egrep/usr/xpg4/bin/grep

一部grepの実装ではマルチバイトをサポートしていないため、正規表現.演算子はマルチバイト文字(非ASCII UTF-8文字など)の任意のバイトと一致する可能性があります。

$ $ locale charmap
UTF-8
$ echo extrême | busybox grep -x ex....e 
$ echo extrême | gnu-grep -x ex....e
extrême
$ echo extrême | busybox grep -x ex.....e
extrême

ê文字はUTF-8で2バイトで構成されているため、extrême7文字ですが8バイトです。

$ printf %s extrême | wc -cm
      7       8

答え2

次の正規表現を使用します。

^ex.{4}e$

前任者:

$ grep -E '^ex.{4}e$' <<< 'ex****e'

または

$ grep '^ex.\{4\}e$' <<< 'ex****e'

出力:

    ex****e

答え3

@stéphane-chazelasが提案した基本パターン:

grep -xE 'ex.{4}e'  

@gilles-quenotの提案と同様に、 '-x'スイッチのため、スペースなしで 'e'、 'x'、ランダムな4文字、および 'e'で構成される行を検索します。

grep -E ^ex.{4}e$

しかし、OPは、一致しないコンテンツと一致するコンテンツを含む行を持つことができるように、「exで始まり、eで終わり、その間に4つの文字があるすべて」を望んでいます。これを得るには、次のパターンが必要です。

    grep -E 'ex.{4}e'

引用符はシェルブラケットの拡張を防ぎます。

関連情報