Использование 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 и поставить свою строку в кавычки. Это должно устранить необходимость в побеге.