Bash スクリプト grep -E "[az,AZ,0-9\.\-]{2,}" /etc/hostname

Bash スクリプト grep -E "[az,AZ,0-9\.\-]{2,}" /etc/hostname

私はシナリオを書いてそれを理解しようとしましたが、ここで私が理解できない詩があります。

grep -E "[a-z,A-Z,0-9\.\-]{2,}" /etc/hostname このコードでは、/etc/hostnameからデータを取得しようとしていることを理解しています。 az、AZ、または数字で始めることは何でも可能です。

しかし、次から始めてください。

\.\-]{2,}

この部分は不明です。それが何かを説明できる人はいますか?

答え1

正規表現の意味は左から右に次のとおりです。

[

文字セット(または文字クラス)の始まり。セットの1文字と一致します。

a-z,A-Z,0-9

文字セット内の1つの文字a-zまたはA-Zまたはが一致することを意味します0-9。ここで、コンマは文字通りコンマを一致させようとしない限り、実際にはオプションです。

\.\-

.はすべての文字と一致できる特殊文字ですが、文字セットに特別な意味がなく、エスケープする必要はありません。ここではエスケープは必要ありません-。セットの最初または最後の文字の場合はリテラルと一致し、セット内の他の2-文字の間にある場合にのみ特別な意味があります。

]

文字セットの終わりです。このセットは1文字a-zまたはまたはA-Zまたは0-9に一致します.-

{2,}

数量子です。これは、前の正規表現が2回以上一致することを意味します。

したがって、コマンドは次のように単純化できます。

grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname

フラグとともに使用すると、-PgrepはパターンをPerl正規表現として解釈します。 Perlの正規表現はPythonの正規表現とほぼ同じです。これは-E私が考えるよりも強力なモデルです。 Perlモードでは、コマンドは次のようになります。

grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname

答え2

{2,}数量子であり、この場合、リスト内でできるだけ多くの文字インスタンスを2つから一致させます[]

\.\-「-」または「。」と一致します。これら2つの文字は通常特殊文字なので、通常はエスケープする必要があります\。ただし、グループ内では[]ポイントが特別ではないため、\この場合は必要ありません。また、-範囲表示なので、グループの最初か最後かは特別ではありません。

したがって、最終的には次のものを使用できます。

[,a-zA-Z0-9.-]{2,}

関連情報