Using sed to remove both an opening and closing square bracket around a string
I'm running this command in a bash shell on Ubuntu 12.04.1 LTS. I'm attempting to remove both the [
and ]
characters in one fell swoop, i.e. without having to pipe to sed a second time.
I know square brackets have special meaning in a regex so I'm escaping them by prepending with a backslash. The result I was expecting is just the string 123
but the square brackets remain and I'd love to know why!
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
This is easy, if you follow the manual carefully: all members inside a character class lose special meaning (with a few exceptions). And ] loses its special meaning if it is placed first in the list. Try:
$ echo '[123]' | sed 's/[][]//g'
123
$
This says:
- inside the outer [ brackets ], replace any of the included characters, namely:
-
]
and -
[
-
- replace any of them by the empty string — hence the empty replacement string
//
, - replace them everywhere (globally) — hence the final
g
.
Again, ]
must be first in the class whenever it is included.
I'm not sure why that doesn't work but this does:
echo '[123]' | sed 's/\(\[\|\]\)//g'
or this:
echo '[123]' | sed -r 's/(\[|\])//g'
You can also try a different approach and match the string inside the brackets (assuming the string can be matched easily and is not defined by the brackets):
echo '[123]' | egrep -o "[0-9]+"
I'm having the same troubles with your original regex using grep
so I suspect this is not just a sed
thing.
Weirdly, these produce different results but one of them matches what you want:
echo '[123]' | egrep -o '[^][]+'
123
echo '[123]' | egrep -o '[^[]]+'
3]
Applying this to your original sed
(and adding the /g
modifier so it removes both brackets):
echo '[123]' | sed 's/[][]//g'
123
To remove everything before and after the brackets :
$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123
If your data is like this always meaning starting and ending with square brackets:
$ echo '[123]' | sed 's/.//;s/.$//;'
123
You can escape the opening bracket using \[
. For the closing bracket, use []]
.