Я запускаю эту команду в оболочке bash в Ubuntu 12.04.1 LTS. Я пытаюсь удалить оба [
и ]
символы одним махом, то есть без необходимости повторного вызова sed.
Я знаю, что квадратные скобки имеют особое значение в регулярном выражении, поэтому я избегаю их, добавляя обратную косую черту. Результат, которого я ожидал, - это просто строка 123
но квадратные скобки остаются, и я хотел бы знать почему!
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
Это легко, если следовать руководство осторожно: все члены внутри класса символов теряют особое значение (за некоторыми исключениями). И] теряет свое особое значение, если помещается первый в списке. Пытаться:
$ echo '[123]' | sed 's/[][]//g'
123
$
Это говорит:
]
и [
//
, g
.Очередной раз, ]
должен будь первым в классе, когда он включен.
Я не уверен, почему это не работает, но это работает:
echo '[123]' | sed 's/\(\[\|\]\)//g'
или это:
echo '[123]' | sed -r 's/(\[|\])//g'
Вы также можете попробовать другой подход и сопоставить строку внутри скобок (при условии, что строка может быть легко сопоставлена и не определяется скобками):
echo '[123]' | egrep -o "[0-9]+"
У меня такие же проблемы с вашим исходным регулярным выражением, используя grep
поэтому я подозреваю, что это не просто sed
вещь.
Как ни странно, они дают разные результаты, но один из них соответствует тому, что вы хотите:
echo '[123]' | egrep -o '[^][]+'
123
echo '[123]' | egrep -o '[^[]]+'
3]
Применяя это к вашему оригиналу sed
(и добавив /g
модификатор, поэтому он удаляет обе кронштейны):
echo '[123]' | sed 's/[][]//g'
123
Чтобы удалить все до и после скобок:
$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123
Если ваши данные такие, всегда означают начало и конец квадратными скобками:
$ echo '[123]' | sed 's/.//;s/.$//;'
123
Если у вас более сложная строка, например «abcdef [123] ghijk», вы также можете использовать внутреннюю команду bash «вырезать» для извлечения текста только между квадратными скобками:
$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123
Вы можете избежать открывающей скобки, используя \[
. Для закрывающей скобки используйте []]
.