Отрицание закрывающей квадратной скобки

Следующее не показывает никаких совпадений:

echo "A" | egrep '[^\]]'

Если я поставлю \[ вместо \], все заработает. Итак, как я могу сопоставить не закрывающая квадратная скобка?

1
0
262
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В выражениях в квадратных скобках вам не нужно экранировать символы, поэтому просто

grep '[^]]'

Вам также не нужен egrep / grep -E, здесь не используются расширенные регулярные выражения.

Ваша другая попытка,

grep '[^\[]'

работал, потому что [ может быть где угодно в выражении скобок, но ] должен быть первым символом. Поскольку вам не нужно убегать, \ на самом деле буквальный, и результатом будет «что угодно, кроме \ или [»:

grep '[^\[]' <<< '\'

не будет совпадать. Таким образом, чтобы включить или исключить скобки, вам не нужно их экранировать, и ] должен быть первым символом:

grep '[[]'  # match opening bracket
grep '[^[]' # match anything but opening bracket
grep '[]]'  # match closing bracket
grep '[^]]' # match anything but closing bracket

и если задействовано больше символов, обязательно вставьте ] в начало:

grep '[]abc]'
grep '[^]abc]'

Если вы этого не сделаете, как в

grep '[^a]bc]'

выражение будет интерпретировано как «что угодно, кроме a, за которым следует bc]»

Это просто упрощенный пример. Рассмотрим [^)]]. Не запутается ли интерпретатор, если он подумает, что первый ] завершает определение символьного класса?

AlwaysLearning 13.09.2018 18:59

@AlwaysLearning Да, было бы. ] должен быть первым символом в выражении, только перед ним ^ для отрицания, если это применимо.

Benjamin W. 13.09.2018 19:02

Другие вопросы по теме