メタキャラクタ

LPIC

コマンドでファイルを指定する時に便利なのがメタキャラクタです。
例えば

ls a*

このように指定すると「aで始まるファイル」の一覧が表示されます。

ls *.txt

これは「.txtで終わるファイル」の一覧です。さらに…

ls a*.txt

こうすれば「aで始まり .txt で終わるファイル」の一覧となります。

もちろん ls だけではなく、rm(削除)や、mv(移動)など、全てのコマンドで使うことができます。
※より正確にはコマンドではなくシェル(bash等)の機能です

*0文字以上の文字にマッチします。「a*」は「ab」「abc」などにマッチしますが「a」にもマッチします。
?「何か1文字」にマッチします。「a?」は「ab」「aa」などにマッチしますが、「a」や「abc」にはマッチしません。
[]カッコ内のいずれかの文字にマッチします。a[bcd] は「ab」「ac」「ad」にマッチします。また[0-9]のようにも使えます。これは0,1,2,3,4,5,6,7,8,9のどれか1文字にマッチします。[a-z]はアルファベット小文字1文字にマッチします。また「!」を先頭に入れるとマッチしない文字を指定できます。a[!0-9]は「aa」「ab」などにはマッチして「a0」や「a1」にはマッチしません。
{}カッコ内の「,」で区切られた文字列にマッチします。a{aa,bb}は、「aaa」と「abb」にマッチします。

正規表現との違い

メタキャラクタの「*」は、grepなどで使う正規表現と似ていますが、意味と挙動が違うので気をつけてください。

メタキャラクタの「*」は0文字以上の文字にマッチですが、
正規表現の「*」は「直前の文字の0回以上の繰り返し」なので、
正規表現で「a*」と書くと「aの0回以上の繰り返し」となり、思ったようにマッチしなくなります。

メタキャラクタ(bashなど)
a*     #「a」「abc」「a1234」「aabbcc.txt」などaで始まるもの全てにマッチ

正規表現(grepなど)
a*     # aの0回以上の繰り返し…?

つまりメタキャラクタと正規表現では違う動作になります。

grepなどでメタキャラクタの「a*」と同じ動作の検索を正規表現でしたい場合は「a.*」と書きます。正規表現で「.」は「任意の1文字」なので「a.*」で「aの後に任意の1文字が0回以上続く」という意味になり「a」「aa」「abc」などにマッチします。

コメント