Bash Basics | Basicsトップページ | トップページ

文字クラス

文字クラスは[:文字クラス:]の形式で指定することで、その文字クラスに属する任意の文字の集合という意味となります。
例えば、[[:alpha:]]という表現は[a-zA-Z]と同じ意味でパターンマッチングで任意のアルファベット一文字とマッチさせることができます。
指定方法が[[:文字クラス:]]のように二重の[[ ]]に囲まれることにご注意ください。これは外側の[]が展開のパターンを含んでいることを示し、内側の[]が文字クラス(等値クラス照合シンボルも同様です)を示しています。

文字クラス意味
alnumアルファベットと数字([0-9A-Za-z])
alphaアルファベット([A-Za-z])
asciiASCII文字([\x00-\x7F])
blank空白文字水平タブ([ \t])
cntrl制御文字([\x00-\x1F\x7F])
digit数字([0-9])
graph印字可能文字(空白文字は含まない)([A-Za-z0-9!"#$%&'()\*+,\-./:;<=>?@[\]^_`{|}~])
lowerアルファベットの小文字([a-z])
print印字可能文字(空白文字を含む)([ A-Za-z0-9!"#$%&'()\*+,-./:;<=>?@[\]^_`{|}~])
punct記号([\!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~])
space空白文字水平タブ垂直タブ改行文字、フォームフィード、キャリッジリターン([ \t\n\v\f\r])
upperアルファベットの大文字([A-Z])
wordアルファベット、数字、アンダースコア([0-9A-Za-z_])
xdigit16進数の表記で使用される文字([0-9A-Fa-f])
文字クラスはロケールによって異り、日本語のロケールを使用している場合は上記に加えて以下の文字クラスも使用可能です。
文字クラス意味
jspace全角文字の空白文字
jhiraひらがな
jkataカタカナ
jkanji漢字
jdigit全角の数字
現在のロケールで使用可能な文字クラスを確認するには、locale -k LC_CTYPE | grep ctype-class-namesを実行します。
$ locale -k LC_CTYPE | grep ctype-class-names
ctype-class-names="upper";"lower";"alpha";"digit";"xdigit";"space";"print";"grap
h";"blank";"cntrl";"punct";"alnum";"combining";"combining_level3";"jspace";"jhir
a";"jkata";"jkanji";"jdigit"


等値クラス

等値クラスは[=文字=]のように指定することで、その文字と等価な(アクセント記号がある/なし)任意の文字にマッチします。
例えば、[=e=]はè、é、ê、ëのいずれかとマッチします。
等値クラスもロケールごとに定義されているため、全てのロケールで同一とは限りません。


照合シンボル

照合シンボルは[.シンボル.]のように指定することで、そのシンボルが意味する文字にマッチします。
例えば、[.asterisk.]は文字としてのアスタリスク*とマッチします。
照合シンボルもロケールごとに定義されているため、全てのロケールで同一とは限りません。

照合シンボル文字またはASCIIコード
NUL\x00
SOH\x01
STX\x02
ETX\x03
EOT\x04
ENQ\x05
ACK\x06
alert\x07
backspace\x08
tab\t
newline\n
vertical-tab\v
form-feed\f
carriage-return\r
SO\xE
SI\xF
DLE\x10
DC1\x11
DC2\x12
DC3\x13
DC4\x14
NAK\x15
SYN\x16
ETB\x17
CAN\x18
EM\x19
SUB\x1A
ESC\x1B
IS4\x1C
IS3\x1D
IS2\x1E
IS1\x1F
space\x20
exclamation-mark!
quotation-mark"
number-sign#
dollar-sign$
percent-sign%
ampersand&
apostrophe'
left-parenthesis(
right-parenthesis)
asterisk*
plus-sign+
comma,
hyphen-
period.
slash/
zero0
one1
two2
three3
four4
five5
six6
seven7
eight8
nine9
colon:
semicolon;
less-than-sign<
equals-sign=
greater-than-sign>
question-mark?
commercial-at@
left-square-bracket[
backslash\
right-square-bracket]
circumflex~
underscore_
grave-accent`
left-curly-bracket{
vertical-line|
right-curly-bracket}
tilde~
DEL\x7F

シェルのオプションextglobが有効な場合、複数のパターン(|で区切られた1つ以上のパターンのリスト)を複合的に利用することができる下記の拡張パターンマッチング演算子が使用できます。
  • ?(パターンリスト)
    指定されたパターンが0回または1回現れるとマッチします。
  • *(パターンリスト)
    指定されたパターンが0回以上現れるとマッチします。
  • +(パターンリスト)
    指定されたパターンが1回以上現れるとマッチします。
  • @(パターンリスト)
    指定されたパターンが1回のみの場合、マッチします。
  • !(パターンリスト)
    指定されたパターンのいずれでもない場合、マッチします。

実行例:
$ touch 1.txt  11.txt  123.txt  123a.txt  A.TXT  a.txt  aa.doc  b.txt  c.txt
$ touch 報告書.doc お知らせ.doc
$ ls
1.txt   123.txt   A.TXT  aa.doc  c.txt         報告書.doc
11.txt  123a.txt  a.txt  b.txt   お知らせ.doc
ファイルをtouchで作成します。

$ echo *
1.txt 11.txt 123.txt 123a.txt A.TXT a.txt aa.doc b.txt c.txt お知らせ.doc 報告書.doc
$ echo ?.txt
1.txt a.txt b.txt c.txt
もよく使う*、?をパターンとして指定した例です。

$ echo [0-9][0-9].txt
11.txt
$ echo ?.txt
1.txt a.txt b.txt c.txt
$ echo [報告]*
報告書.doc
$ echo [![:digit:]]*
A.TXT a.txt aa.doc b.txt c.txt お知らせ.doc 報告書.doc
[]に文字の集合をパターンとして指定した例です。
漢字も問題なく使用できます。
!を使って指定した文字集合以外とすることもできます。

$ echo [[:digit:]].txt
1.txt
$ echo [[:alpha:]].txt
a.txt b.txt c.txt
$ echo [[:jhira:]]*
お知らせ.doc
$ echo [[:jkanji:]][[:jkanji:]][[:jkanji:]].doc
報告書.doc
[]に文字クラスをパターンとして指定した例です。
[:digit:]も[:alpha:]も1文字にマッチするため、拡張子よりも前の部分が1文字のファイルのみマッチしています。
ロケールが日本語環境の場合には、[:jhira:]や[:jkanji:]も全角文字1文字とマッチすることがわかります。

$ echo [[.one.]].txt
1.txt
[]に照合シンボルをパターンとして指定した例です。

$ touch '*.txt'
$ ls
*.txt  11.txt   123a.txt  a.txt   b.txt  お知らせ.doc
1.txt  123.txt  A.TXT     aa.doc  c.txt  報告書.doc
$ rm [[.asterisk.]].txt
$ ls
1.txt   123.txt   A.TXT  aa.doc  c.txt         報告書.doc
11.txt  123a.txt  a.txt  b.txt   お知らせ.doc
照合シンボルを使用する例はあまりないかも知れませんが、例えば、特殊文字を含むファイルを誤って作成してしまった場合などにも対応が可能です。

$ shopt -s extglob
$ echo @([[:digit:]]|[[:alpha:]]).txt
1.txt a.txt b.txt c.txt
$ echo [[:digit:][:alpha:]].txt
1.txt a.txt b.txt c.txt
$ echo *([[:digit:]]).txt
1.txt 11.txt 123.txt
$ echo *([0-9]|[ab]).txt
1.txt 11.txt 123.txt 123a.txt a.txt b.txt
$ echo *([0-9][0-9][0-9]|[ab]).*
123.txt 123a.txt a.txt aa.doc b.txt
$ shopt -s nocaseglob
$ echo *([0-9][0-9][0-9]|[ab]).txt
123.txt 123a.txt A.TXT a.txt aa.doc b.txt
シェルのオプションによる動作の変化の例です。
@([[:digit:]]|[[:alpha:]])は数字1文字かアルファベット1文字の1回にマッチするので、[[:digit:][:alpha:]]と同じ意味になります。
*([0-9][0-9][0-9]|[ab])は3文字の数字かaまたはbの0回以上の繰り返しにマッチします。
nocaseglobオプションを有効にすると英大文字と英小文字の区別がなくなります。