[Linux] シェルの正規表現とワイルドカードの違い

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\]ca[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/ pocomposition/
org/apache/maven/model/interlation po/
org/apache/maven/model/super pom/
org/apache/maven/model/composition/DependencyManagementIm porter.class
...
ワイルドカード表現と正規表現を混同しているため、ここでは grep はユーザーが入力した正規表現を考慮し、通常の 'pom*' は po で始まり、その後に 0 個以上の m が続く文字列を検索することを意味します。次のコマンドを実行して、必要なものを取得します。

jar tf maven-model-builder-3.5.3.jar | grep 'pom.*'   //此时才是pom开头,.号在正则中是特殊字符,代表任意一个字符, 后面跟个*号吗,表示pom后面 出现0个或多个字符

参考

LinuxShell の正規表現とワイルドカードの違い
シェルのワイルドカード

おすすめ

転載: blog.csdn.net/m0_45406092/article/details/129370142