Назад | Перейти на главную страницу

Использование sed для удаления открывающей и закрывающей квадратных скобок вокруг строки

Я запускаю эту команду в оболочке bash в Ubuntu 12.04.1 LTS. Я пытаюсь удалить оба [ и ] символы одним махом, то есть без необходимости повторного вызова sed.

Я знаю, что квадратные скобки имеют особое значение в регулярном выражении, поэтому я избегаю их, добавляя обратную косую черту. Результат, которого я ожидал, - это просто строка 123 но квадратные скобки остаются, и я хотел бы знать почему!

~$ echo '[123]' | sed 's/[\[\]]//'
[123]

Это легко, если следовать руководство осторожно: все члены внутри класса символов теряют особое значение (за некоторыми исключениями). И] теряет свое особое значение, если помещается первый в списке. Пытаться:

$ echo '[123]' | sed 's/[][]//g'
123
$

Это говорит:

  1. внутри внешний [скобки] замените любой из включенных символов, а именно:
    • ] и
    • [
  2. замените любой из них пустой строкой - следовательно, пустая строка замены //,
  3. замените их где угодно (глобально) - отсюда последний 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

Вы можете избежать открывающей скобки, используя \[. Для закрывающей скобки используйте []].