Bash Basics | Basicsトップページ | トップページ
文字集合
シェルでは様々な方法でパターンマッチングが利用できますが、パターンの中では文字の集合を表す文字クラス、等値クラス、照合シンボルによって一定の文字にマッチさせることができます。
文字クラスは[:文字クラス:]の形式で指定することで、その文字クラスに属する任意の文字の集合という意味となります。
例えば、[[:alpha:]]という表現は[a-zA-Z]と同じ意味でパターンマッチングで任意のアルファベット一文字とマッチさせることができます。
指定方法が[[:文字クラス:]]のように二重の[[ ]]に囲まれることにご注意ください。これは外側の[]が展開のパターンを含んでいることを示し、内側の[]が文字クラス(等値クラス、照合シンボルも同様です)を示しています。
文字クラス | 意味 |
---|---|
alnum | アルファベットと数字([0-9A-Za-z]) |
alpha | アルファベット([A-Za-z]) |
ascii | ASCII文字([\x00-\x7F]) |
blank | 空白文字と水平タブ([ \t]) |
cntrl | 制御文字([\x00-\x1F\x7F]) |
digit | 数字([0-9]) |
graph | 印字可能文字(空白文字は含まない)([A-Za-z0-9!"#$%&'()\*+,\-./:;<=>?@[\]^_`{|}~]) |
lower | アルファベットの小文字([a-z]) |
印字可能文字(空白文字を含む)([ A-Za-z0-9!"#$%&'()\*+,-./:;<=>?@[\]^_`{|}~]) | |
punct | 記号([\!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]) |
space | 空白文字、水平タブ、垂直タブ、改行文字、フォームフィード、キャリッジリターン([ \t\n\v\f\r]) |
upper | アルファベットの大文字([A-Z]) |
word | アルファベット、数字、アンダースコア([0-9A-Za-z_]) |
xdigit | 16進数の表記で使用される文字([0-9A-Fa-f]) |
文字クラス | 意味 |
---|---|
jspace | 全角文字の空白文字 |
jhira | ひらがな |
jkata | カタカナ |
jkanji | 漢字 |
jdigit | 全角の数字 |
$ 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 | / |
zero | 0 |
one | 1 |
two | 2 |
three | 3 |
four | 4 |
five | 5 |
six | 6 |
seven | 7 |
eight | 8 |
nine | 9 |
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 |
$ 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
[]に文字クラスをパターンとして指定した例です。$ 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
シェルのオプションによる動作の変化の例です。