ワイルドカード正規表現とBash

ワイルドカード正規表現とBash

bashでワイルドカードを使用するのか正規表現を使用するのかわかりません。 Bashシェルスクリプティングに関する私の本は、主題を明確にしなかったし、結局正しく理解していなかったので、特に混乱していました。たとえば、説明すると次のようになります。 ... .(ドット)文字は「すべての単一文字」を意味します。したがって、acはabc、aac、aqcなどとすべて一致します。

いいね、いいね。正規表現なので彼が間違っていると思います。しかし、私が最初にしたことはそれをテストすることでした。

$ touch abc aac aqc
$ ls
aac  abc  aqc
$ ls a.c
ls: cannot access 'a.c': No such file or directory

そんな中、Googleにアクセスして「ワイルドカードチュートリアル」という投稿を発見し、「そうなんだ」と思いました。

https://linuxhint.com/bash_globbing_tutorial/

彼の「ワイルドカード指定」の半分は、ワイルドカードなしでBREを使用するgrepを介して行われたので、私はほとんどすぐにこれがすべて間違っていると思いました。例えば、彼は次のように指摘した。

"$ はターミネータを定義するために使用されます。"

これは正規表現が意味するものであり、ワイルドカードではないので間違っています。だから私はそれをテストします:

$ ls
aac  abc  aqc
$ ls c$
ls: cannot access 'c$': No such file or directory

したがって、彼がGoogleでクリックした最初のリンクも間違っています。このトピックを明確に説明する本やオンライン投稿がないようです。正規表現とワイルドカードの違いを明確に定義するのに役立ちます。

ベストアンサー1

正規表現が使用される唯一の場所は生成された演算子bashです。この場合、POSIX 拡張正規表現です。=~[[ ... ]]

if [[ abc =~ ^a.b$ ]]; then
  echo 'abc matches the ^a.b$ ERE'
fi

他の場所:

  • case abc in (a?b) echo 'abc matches the a?b glob pattern'; esac
  • [[ abc = a?b ]] && echo 'abc matches the a?b glob pattern'
  • printf '%s\n' a?b:実際のワイルドカード(ファイル名生成、パス名拡張)
  • printf '%s\n' "${var#a?b}" "${var%a?b}" "${var##a?b}" "${var%%a?b}" "${var/a?b/x}
  • compgen -G 'a?b'(と同じcomplete)。
  • help 'r??d'

これはシェルワイルドカード(globパターン、ファイル名/ fnmatchパターン)です。

info bash patternBashに何があるかを具体的に確認するには、実行してください。info -n conditional bashあなたを連れて行きます条件付き構成[[ ... ]]そこでその演算子の説明を見つけることができます=~

grep、、、、などの他のツールは、さまざまな状況で両方または両方findを使用できます。その文書でお知らせします。さらに、両方のタイプのパターンは様々なスタイルで提供される。経験的に、globパターンは通常ファイル名(たとえばglobまたはシェルの' / ' )を一致させるために使用されますが、regexpは任意のテキストを一致させるために使用されます。vimperlfirefoxfind-name-path

ksh93は、globで正規表現(デフォルト、拡張、Perlのような、または高度な)を使用できるシェルです。

$ printf '%s\n' ~(E:^a.b$)
a=b
axb

zshでは、glob修飾子を使用してglobで正規表現(拡張またはpcre)を使用できますe

$ printf '%s\n' *(e['[[ $REPLY =~ "^a.b$" ]]'])
a=b
axb
$ zmodload zsh/pcre
$ printf '%s\n' *(e['[[ $REPLY -pcre-match "^a.b\z" ]]'])
a=b
axb

(ここで、\zPCREはEREと同じです。$たとえば、PCREはトピック$の終わりと一致します。だけでなく、トピックの終わりの改行文字の前にも同じです。)。

rematchpcreオプション(set -o rematchpcre)を設定すると、EREの[[ =~ ]]代わりにPCREが使用されます。

おすすめ記事