このページの内容

5.5 文字クラスと括弧式

括弧式は、「[」と「]」で囲んだ文字のリストです。リスト内の任意の1文字に一致します。リストの最初の文字がキャレット「^」なら、リストに含まれない任意の文字に一致します。たとえば、次のコマンドは文字列「gray」または「grey」を「blue」に置き換えます。

sed  's/gr[ae]y/blue/'

括弧式は基本正規表現でも拡張正規表現でも使えます(つまり、-E/-rオプションの有無にかかわらず使えます)。

括弧式の中で、範囲式はハイフンで区切った2文字からなります。並べ替え順でその2文字の間にある任意の1文字に、両端を含めて一致します。既定のCロケールでは、並べ替え順は本来の文字順です。たとえば、「[a-d]」は「[abcd]」と同じです。

また、括弧式の中では、次に示す名前付き文字クラスがあらかじめ定義されています。

これらの名前付きクラスは、それ自体を括弧の内側で使わなければなりません。正しい使用例:

$ echo 1 | sed 's/[[:digit:]]/X/'
X

誤った使用法は新しいsedでは拒否されます。古い版では受け付けていましたが、単一の括弧式として扱いました(これは「[dgit:]」、つまり文字d/g/i/t/:だけに一致する式と同じです)。

# current GNU sed versions - incorrect usage rejected
$ echo 1 | sed 's/[:digit:]/X/'
sed: character class syntax is [[:space:]], not [:space:]

# older GNU sed versions
$ echo 1 | sed 's/[:digit:]/X/'
1
‘[:alnum:]’

字母と数字:「[:alpha:]」と「[:digit:]」。「C」ロケールとASCII文字エンコーディングでは、「[0-9A-Za-z]」と同じです。

‘[:alpha:]’

字母:「[:lower:]」と「[:upper:]」。「C」ロケールとASCII文字エンコーディングでは、「[A-Za-z]」と同じです。

‘[:blank:]’

空白文字:スペースとタブ。

‘[:cntrl:]’

制御文字。ASCIIでは、8進数の文字コード000〜037、および177(DEL)に当たります。ほかの文字集合では、対応する文字があればそれに当たります。

‘[:digit:]’

数字:0 1 2 3 4 5 6 7 8 9。

‘[:graph:]’

可視文字:「[:alnum:]」と「[:punct:]」。

‘[:lower:]’

小文字。「C」ロケールとASCII文字エンコーディングでは、a b c d e f g h i j k l m n o p q r s t u v w x y zです。

‘[:print:]’

表示可能な文字:「[:alnum:]」「[:punct:]」、およびスペース。

‘[:punct:]’

句読点文字。「C」ロケールとASCII文字エンコーディングでは、! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~です。

‘[:space:]’

空白類文字。「C」ロケールでは、タブ、改行、垂直タブ、フォームフィード、キャリッジリターン、およびスペースです。

‘[:upper:]’

大文字。「C」ロケールとASCII文字エンコーディングでは、A B C D E F G H I J K L M N O P Q R S T U V W X Y Zです。

‘[:xdigit:]’

16進数字:0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f。

これらのクラス名に含まれる括弧は記号名の一部です。括弧式を区切る括弧とは別に、必ず含めてください。

ほとんどのメタ文字は、括弧式の中では特別な意味を失います。

‘]’

リストの最初の要素でなければ、括弧式を終わらせます。そのため、「]」をリストの要素にするには、最初に置かなければなりません。

‘-’

リストの先頭や末尾、または範囲の終点でなければ、範囲を表します。

‘^’

リストに含まれない文字を表します。「^」をリストの要素にするには、先頭以外の位置に置いてください。

TODO:この段落を組み込む(BREの節からそのままコピーしたもの)。

$、*、.、[、\は、通常listの中では特殊文字になりません。たとえば、ここでは\が特殊文字ではないため、[\*]は「\」または「*」に一致します。ただし、[.ch.]、[=a=]、[:space:]のような文字列はlistの中でも特別な意味を持ち、それぞれ照合記号、等価クラス、文字クラスを表します。そのため、listの中で[の後に.、=、:のいずれかが続く場合は特殊文字になります。また、POSIXLY_CORRECTモード以外では、\nや\tなどの特殊なエスケープがlistの中で認識されます。エスケープシーケンス:特殊文字の指定を参照してください。

‘[.’

照合記号の開始を表します。

‘.]’

照合記号の終了を表します。

‘[=’

等価クラスの開始を表します。

‘=]’

等価クラスの終了を表します。

‘[:’

文字クラス記号の開始を表し、その後には有効な文字クラス名が必要です。

‘:]’

文字クラス記号の終了を表します。