Использование escape-символов внутри grep

у меня есть следующее регулярное выражение для ликвидации пробелов, табуляций и новых строк: [^ nt]

однако я хочу расширить это для некоторых дополнительных символов, таких как > и <.

пробовал [^ nt<>], который хорошо работает сейчас, но я хочу, чтобы выражение не совпадало, если < или > начинается с .

пробовал [^ nt[^]<[^]>], но это не работало.

3 ответов


может ли какая-либо из последовательностей ниже произойти на Вашем входе?

\>
\\>
\\>
\blank
\tab
\newline
...

если да, то как вы предлагаете их лечить?

если нет, то нулевая ширина look-behind утверждения будет делать трюк, при условии, что ваше регулярное выражение двигатель поддерживает его. Это будет иметь место в любом движке, который поддерживает регулярные выражения в стиле Perl (включая Perl, PHP и т. д.):

 (?<!\)[ \n\t<>]

вышеуказанное будет соответствовать любому не-экранированному пространству, новой строке, вкладке или угловым скобкам. Более обобщенно (используя \s для обозначения любых пробелов, включая \r):

 (?<!\)\s

альтернативно, используя дополнительные обозначения без необходимости утверждения нулевой ширины (но, возможно, меньше эффективно):

 (?:[^ \n\t<>]|\[<>])

вы также можете использовать вариант последней обработки \>, \\>, \\> etc. случаи, а также до некоторого конечного числа предыдущих обратных косых черт, таких как:

 (?:[^ \n\t<>]|(?:^|[^<>])[\]{1,3,5,7,9}[<>])

по данным страница grep man:

скобочное выражение-это список символы, заключенные в [ и ]. Он соответствует любому символу в этом список; если первый символ список каре ^ значит любого персонажа нет в списке.

Это означает, что вы не можете сопоставить последовательность символов, таких как \ только отдельные символы.

Если у вас нет версии grep, построенной с Perl поддержка regex, то вы можете использовать lookarounds, как один из других упомянутых плакатов. Однако не все версии grep имеют эту поддержку.


возможно, вы можете использовать для egrep и поставить свою строку в кавычки. Это должно устранить необходимость в побеге.