6

Question: Why can't I escape the "]"?

$ printf "*#$@~\!&*()[]\n"
*#~\!&*()[]
$ printf "*#$@~\!&*()[]\n" | sed 's/[*#$@~!&*()\[\]]//g'
*#~\!&*()
$
8

Inside [...], backslash is not special. [\[] matches both backslash and [1.

If you want to include the ] character in the set, you have to make sure it's first: []X] matches ] or X while [X]] would match X followed by ] (and [X\]] would match X or \ followed by ]). To exclude it, it has to be right after ^: [^]X] is any character but ] or X.

So, in your example:

sed 's/[]*\#$@~!&*()[]//g'

1There are some exceptions to that with GNU sed when the POSIX conformance mode has not been enabled (via $POSIXLY_CORRECT or --posix) which is why, for compatibility with that implementation, when you do need backslash to be included in the set, it's better to write it as [\\].

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.