web-dev-qa-db-ja.com

ファイルパスのワイルドカードがgrepで機能しない

次のような単語をgrepする必要があります。

ABC-DEF
AB2-DEF
AB3-DEF
AB-DEF

だから私は試していました:

grep AB*-DEF
grep -w -AB*-DEF
grep -w AB*DEF

しかし、どちらも機能していません。

3
GP92

正規表現の*は、ファイル名グロブのようなものではありません。前の文字/パターンの0以上を意味します。したがって、例ではAを検索し、次に0以上のBを検索し、次に-DEFを検索します。

正規表現の.は「任意の文字」を意味するため、次を使用してパターンを修正できます

grep 'AB.*DEF'
13
Eric Renouf

パターンに関する限り、これは意図された文字列のみに一致させるのが最も安全です。

grep 'AB.\{0,1\}-DEF' file.txt

または

grep -E 'AB.?-DEF' file.txt

.は任意の1文字に一致し、?および\{0,1\}は前のトークンに0回または1回一致するため、合計で.?および.\{0,1\}は前の0文字または1文字に一致します-DEF

AB.*-DEFまたはAB.*DEFを使用すると、grepは意図しない文字列に貪欲に一致します。次に例を示します。

ABCG-DEF
ABCGLHHJKH90-DEF
3
heemayl

以下を使用できます。

grep 'AB.*-DEF' file.txt
1
nghnam

正規表現のワイルドカードは、シェルによって展開されます。シェルはそれらをファイル名のメタ文字として扱います。そのため、シェルにnotをファイル名のメタ文字として評価するように指示する必要があり、メタ文字の直前に一重引用符、二重引用符、またはバックスラッシュ文字を使用してそれらを引用します。次に、シェルは正規表現を処理するgrepユーティリティに正規表現を送信します。

0
unxnut