グローバルと正規表現の一致

グローバルと正規表現の一致

BashGlobパターンマッチングには2種類ありますRegex。一般的な経験則は、1)globファイル名を検索する方が簡単です。 2)regexテキストを検索する方が簡単です。

Glob先頭にはメタ文字を使用し、regex最後にはメタ文字を使用してくださいpattern

Glob          Regex
?(pattern)    (pattern)?
*(pattern)    (pattern)*     
+(pattern)    (pattern)+    

そのため、ファイルがワイルドカード(例*.sh:)と一致する方法を理解するのが困難です。ワイルドカードはグローバルパターンとは異なりますか?私が知っている限り、検索パターンには*.sh次の文字と一致するメタ文字は含まれていません*

答え1

ワイルドカードはグローバルパターンの一部です。最も簡単な*合計?はワイルドカードとグローバルパターンです。以下はいくつかの簡単なグローブです:

*.sh              # could match "fred.sh" and also ".sh"
matchme           # would match "matchme"
file[0-9]*.txt    # could match "file12.txt" but also "file12yz.txt"
?ile              # could match "mile" or "file" but not "smile"

あなたの質問にリストしたグローバルパターンは次のとおりです。拡大するグローバルモード。bash作成時に有効になっているが有効になっている場合は、ファイル名の一致にのみ使用できるため[[ "$var" == {pattern} ]]です。extglob

shopt -s extglob        # Enable extended globs (bash)
ls -d +([[:digit:]])    # List files/directories whose names are just digits

私が知っている限り、検索パターンには*.sh次の文字と一致するメタ文字は含まれていません。*

このパターンは、ゼロ個以上の文字に一致するワイルドカード文字を使用します*.sh*globは正規表現(一般または拡張)ではありませんが、同じであることを覚えておいてください。

Glob            RE              Description

*.sh            ^.*\.sh$        Match anything ending with the three characters ".sh"
?ile            ^.ile$          Match any single character then the text "ile"
+([[:digit:]])  ^[[:digit:]]+$  Match one or more digits (potentially any alphabet, not just 0-9)

Extended Glob   ERE             Description
@(one|two)      ^(one|two)$     Match either "one" or "two"

「1」または「2」に一致する一般REには、角かっこと区切り文字を表示する必要があります。つまり^\(one\|two\)$、含まれないからです。対照的に、拡張正規表現にはこれらの演算子が含まれています。^(one|two)$

関連情報