記事ディレクトリ
1. 正規表現
正規表現は、テキスト内の修飾された文字列と一致するために使用されます。これは包括的な一致です。Linux シェルの grep、awk、sed などのコマンドはすべて正規表現をサポートしています。
[Linuxコマンド] findコマンドとgrepコマンド(正規表現)の<2.2 正規表現>の章を参照してください。
2. ワイルドカード
ワイルドカードは、完全に一致する修飾されたファイル/パス名を照合するために使用されます。Linux シェルの ls、find、および cp コマンドは正規表現をサポートしていないため、ワイルドカードはファイル/パスの一致にのみ使用できます。
シェル コマンドでは、通常、一部のファイルと一致させるためにワイルドカード式が使用されます。たとえば、次のコマンドは、現在のディレクトリ内でサフィックス .xml を持つすべてのファイルを検索できます。
find . -name "*.xml"
シェルで使用できるワイルドカードは次のとおりです。
ワイルドカード | 説明する |
---|---|
* | 0 または任意の文字に一致 |
? | 任意の文字に一致し、出現する必要があります |
[ ] | 角括弧内の文字と一致します。a[xyz]b、a と b の間には 1 文字だけが必要ですが、axb、ayb、azb のように x、y、または z のみにすることができます。 |
[-] | 角括弧内の文字と一致します。たとえば、小文字に一致する [ab] は、セット内の 1 つのみと一致します。 |
[^] | 括弧を除く 1 文字と一致します。たとえば、[^0-9] は数字以外の文字と一致し、セット内の 1 つのみと一致します。 |
{アブ、バ} | これらの文字列のいずれかと一致します。例: ab または ba に一致します |
2.1 エスケープ文字
場合によっては、一致するコンテンツに*
、 、 、 [ などのワイルドカードの記号が含まれることがあります。?
本来の意味を表現するには、次のようにエスケープ文字 \ を使用する必要があります。
a\[ac\]c
a[a]c または a[c]c に一致することを意味します- \自体は
\\
で表されます。
3. ワイルドカード表現と正規表現の違い
ワイルドカードは正規表現によく似ていますが、同じものではありません。正規表現内のこれらの量指定子の一致ルールは、ここで説明するいくつかのワイルドカードの一致ルールとは異なります。
-
たとえば、正規表現の * は前の文字を何度でも繰り返すことを意味し、ワイルドカード式の * は 0 個以上の任意の文字を意味します。
正規表現では、ab* は a の後に 0 個以上の bs が続く文字列を意味しますが、ワイルドカード式では、ab* は ab の後に任意の数の文字が続く文字列を意味します。 -
Java などの正規表現は通常、コンテンツの一部と一致するために使用される部分一致です。たとえば、正規表現 a を使用して文字列 bac と一致した場合、一致は成功し、一致したコンテンツは a になります。
grep 的正则和通配符相似,也是匹配整行,除非通过 -o 命令强制显示为匹配的片段
ただし、ワイルドカード式はそれらすべてに一致し、成功した一致とみなされるには、式が文字列全体に一致する必要があります。たとえば、ワイルドカード式を使用して文字列 bac に一致する場合、一致結果は文字列 bac 全体になります
*a*
。
4. 反例
反例として、grep を使用する場合は、ワイルドカードではなく正規表現を使用する必要があります。jarパッケージ内にpom関連のファイルがあるかどうかを確認したいので、次のコマンドを入力しました。
jar tf maven-model-builder-3.5.3.jar | grep 'pom*'
その結果、大量のファイルが入力され、多くのファイルには文字列 pom がありませんでした。出力は次のようなものです。
...
org/apache/maven/model/ po
composition/
org/apache/maven/model/interlation po
/
org/apache/maven/model/super pom
/
org/apache/maven/model/composition/DependencyManagementIm po
rter.class
...
ワイルドカード表現と正規表現を混同しているため、ここでは grep はユーザーが入力した正規表現を考慮し、通常の 'pom*' は po で始まり、その後に 0 個以上の m が続く文字列を検索することを意味します。次のコマンドを実行して、必要なものを取得します。
jar tf maven-model-builder-3.5.3.jar | grep 'pom.*' //此时才是pom开头,.号在正则中是特殊字符,代表任意一个字符, 后面跟个*号吗,表示pom后面 出现0个或多个字符