Bash
Glob
パターンマッチングには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)$