私はシナリオを書いてそれを理解しようとしましたが、ここで私が理解できない詩があります。
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
フラグとともに使用すると、-P
grepはパターンをPerl正規表現として解釈します。 Perlの正規表現はPythonの正規表現とほぼ同じです。これは-E
私が考えるよりも強力なモデルです。 Perlモードでは、コマンドは次のようになります。
grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname
答え2
は{2,}
数量子であり、この場合、リスト内でできるだけ多くの文字インスタンスを2つから一致させます[]
。
\.\-
「-」または「。」と一致します。これら2つの文字は通常特殊文字なので、通常はエスケープする必要があります\
。ただし、グループ内では[]
ポイントが特別ではないため、\
この場合は必要ありません。また、-
範囲表示なので、グループの最初か最後かは特別ではありません。
したがって、最終的には次のものを使用できます。
[,a-zA-Z0-9.-]{2,}