Соответствие специальным символам с регулярным выражением

10

Скажем, это очень легко, если я хочу найти что-то, содержащее строчные буквы и цифры с

производим_текст | grep -E '[0-9a-z]'

Скобки полезны для сопоставления с набором символов, но как насчет тех, которые являются чем-то особенным?
Если я хочу, используя скобки, сопоставить любой символ, кроме одного из них: закрывающую скобку ], тире (или дефис) «-», обе косые черты /и \каретку ^, двоеточие :.
Будет ли это выглядеть так (я знаю, что это не работает)?

[^] - / \ ^:]
iBug
источник

Ответы:

11

Чтобы сопоставить литерал ]и литерал -в выражении в скобках, вы должны будете использовать их следующим образом:

[^]/\^:-]

или, что еще лучше, поскольку некоторые инструменты требуют экранирования от обратной косой черты :

[^]/\\^:-]

то есть
правая квадратная скобка (']') теряет свое особое значение и представляется в выражении в скобках, если оно встречается первым в списке (после начального '^', если есть),
а
символ дефис-минус должен обрабатываться как сам, если это происходит первым (после начального '^', если есть) или последним в списке,
следовательно,
если выражение в скобках указывает и '-', и ']', то ']' должно быть помещено первым (после '^', если есть) и '-' последний в выражении в скобках.
Правила для скобочных выражений одинаковы для ERE и BRE .

don_crissti
источник
2
Я бы удвоил обратную косую черту, чтобы быть в безопасности. Это необходимо для многих awkреализаций, perlнапример.
Стефан
А как насчет "От каретки до закрывающей скобки"? Нравится [^-]](это не удается)?
iBug
2
@iBug - уверен, что он потерпит неудачу, так как правая скобка должна быть первой, если вы хотите, чтобы она соответствовала буквально. Я не уверен, что понял смысл того «диапазона», который вы упомянули как ^есть, ]так [^-]]что он не сработает, даже если оба ^и ]будут трактоваться буквально (просто как [b-a]). В любом случае, если вы хотите сопоставить, например, ;с закрывающей скобкой, вы можете использовать диапазон до символа раньше ](который является обратной косой чертой) и включить в ]качестве первого символа в скобке выражение, например [];-\\].
don_crissti
@don_crissti Как насчет [[.^.]-[.-.]]? У меня есть ощущение, что это сработает. Давайте предположим, что код ASCII ^раньше -.
iBug
Получил ленивое решение для моего вопроса. Просто получите все, что нужно для сопоставления символов, например[^[.].][.-.]/\^:]
iBug
7

Странно, возможно, вам нужно иметь пару символов в определенных местах. Вы должны иметь ]в качестве первого символа в наборе, и -должен быть последним символом в наборе.

Вот RE, который отвечает вашим требованиям [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4
roaima
источник
1
Это не очень странно, просто необходимо избежать двусмысленности
Кевин
1
Второй [персонаж не принадлежит там; ОП не хочет исключать это.
Скотт
@ Скотт хорошо заметили, спасибо. Ответ обновлен.
roaima