sed: Character Classes and Bracket Expressions
5.5 Character Classes and Bracket Expressions
=============================================
A "bracket expression" is a list of characters enclosed by '[' and ']'.
It matches any single character in that list; if the first character of
the list is the caret '^', then it matches any character *not* in the
list. For example, the following command replaces the words 'gray' or
'grey' with 'blue':
sed 's/gr[ae]y/blue/'
Bracket expressions can be used in both ⇒basic BRE syntax. and
⇒extended ERE syntax. regular expressions (that is, with or
without the '-E'/'-r' options).
Within a bracket expression, a "range expression" consists of two
characters separated by a hyphen. It matches any single character that
sorts between the two characters, inclusive. In the default C locale,
the sorting sequence is the native character order; for example, '[a-d]'
is equivalent to '[abcd]'.
Finally, certain named classes of characters are predefined within
bracket expressions, as follows.
These named classes must be used _inside_ brackets themselves.
Correct usage:
$ echo 1 | sed 's/[[:digit:]]/X/'
X
Incorrect usage is rejected by newer 'sed' versions. Older versions
accepted it but treated it as a single bracket expression (which is
equivalent to '[dgit:]', that is, only the characters 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:]'
Alphanumeric characters: '[:alpha:]' and '[:digit:]'; in the 'C'
locale and ASCII character encoding, this is the same as
'[0-9A-Za-z]'.
'[:alpha:]'
Alphabetic characters: '[:lower:]' and '[:upper:]'; in the 'C'
locale and ASCII character encoding, this is the same as
'[A-Za-z]'.
'[:blank:]'
Blank characters: space and tab.
'[:cntrl:]'
Control characters. In ASCII, these characters have octal codes
000 through 037, and 177 (DEL). In other character sets, these are
the equivalent characters, if any.
'[:digit:]'
Digits: '0 1 2 3 4 5 6 7 8 9'.
'[:graph:]'
Graphical characters: '[:alnum:]' and '[:punct:]'.
'[:lower:]'
Lower-case letters; in the 'C' locale and ASCII character encoding,
this is '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:]'
Printable characters: '[:alnum:]', '[:punct:]', and space.
'[:punct:]'
Punctuation characters; in the 'C' locale and ASCII character
encoding, this is '! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \
] ^ _ ` { | } ~'.
'[:space:]'
Space characters: in the 'C' locale, this is tab, newline, vertical
tab, form feed, carriage return, and space.
'[:upper:]'
Upper-case letters: in the 'C' locale and ASCII character encoding,
this is '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:]'
Hexadecimal digits: '0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'.
Note that the brackets in these class names are part of the symbolic
names, and must be included in addition to the brackets delimiting the
bracket expression.
Most meta-characters lose their special meaning inside bracket
expressions:
']'
ends the bracket expression if it's not the first list item. So,
if you want to make the ']' character a list item, you must put it
first.
'-'
represents the range if it's not first or last in a list or the
ending point of a range.
'^'
represents the characters not in the list. If you want to make the
'^' character a list item, place it anywhere but first.
TODO: incorporate this paragraph (copied verbatim from BRE section).
The characters '$', '*', '.', '[', and '\' are normally not special
within LIST. For example, '[\*]' matches either '\' or '*', because the
'\' is not special here. However, strings like '[.ch.]', '[=a=]', and
'[:space:]' are special within LIST and represent collating symbols,
equivalence classes, and character classes, respectively, and '[' is
therefore special within LIST when it is followed by '.', '=', or ':'.
Also, when not in 'POSIXLY_CORRECT' mode, special escapes like '\n' and
'\t' are recognized within LIST. ⇒Escapes.
'[.'
represents the open collating symbol.
'.]'
represents the close collating symbol.
'[='
represents the open equivalence class.
'=]'
represents the close equivalence class.
'[:'
represents the open character class symbol, and should be followed
by a valid character class name.
':]'
represents the close character class symbol.