2

I would like to match these characters: [ ] ( ) in a character class in a regex, how can I do that?

echo 'some text (some text in parenthesis) [some other in brackets]' | grep '[\[\]\(\)]'

This one doesn't match any character.

Rhubbarb
  • 4,058
  • 6
  • 34
  • 40
nagy.zsolt.hun
  • 5,542
  • 8
  • 48
  • 82

3 Answers3

5

You can use it like this:

echo 'some text (some text in paranthesis) [some other in brackets]' | grep -o '[][()]'

(
)
[
]

You don't need to escape ( and ) inside a character class. Moreover if you place ] and [ right after opening [ then you don't need to escape them either.

anubhava
  • 713,503
  • 59
  • 514
  • 593
1

Just FYI:

Accoding to the grep documentation, section 3.2 Character Classes and Bracket Expressions:

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.

Also, you can see that (, [ and ) are not special in the bracket expressions.

Since ] in your '[\[\]\(\)]' bracket expression pattern is not the first character, it ends the pattern, and the next ] created an incomplete bracket expression.

Wiktor Stribiżew
  • 561,645
  • 34
  • 376
  • 476
0

The most common way is to put a \ before the character, but oddly enough that doesn't seem to work for ] with grep.

If you can use Perl, do this:

% cat yourfile.txt | perl -ne 'print if(/[\[\]\(\)]/);';
OneSolitaryNoob
  • 5,001
  • 3
  • 21
  • 41