awk regexp когда не совпадает

Я получил некоторую помощь, прежде чем здесь, чтобы построить регулярное выражение, которое будет соответствовать любым строкам, которые начинаются с ":", затем что-нибудь, затем "(" и после этого что-нибудь, но это не может заканчиваться на ")

Регулярное выражение, которое я использовал, было таким:

/:.+ \(.[^)]*$/

Кажется, он работает достаточно хорошо. У меня были следующие строки ввода:

:web_application_settings (
:isakmp.phase1_DH_groups (
:ike_p1 (
:ike_p1_dh_grp (ReferenceObject
:isakmpkeymanager (lalalal)

И вывод был только::ike_p1_dh_grp (ReferenceObject

Но потом мне довелось добавить строку:

:isakmpkeymanager ()

Это не должно соответствовать, но это соответствует, что я думаю странно. Что я пропустил в регулярном выражении, которое позволило этой строке, заканчивающейся символом "), все еще совпадать, когда я использую Не совпадать: [^)] с последующим началом, чтобы позволить ему не совпадать, и затем концом строки.

2 ответа

Решение

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

Пытаться:

awk '/:.+ \([^)]+$/' File

Что пошло не так

Давайте посмотрим на оригинальное регулярное выражение, /:.+ \(.[^)]*$/, один шаг за раз:

  1. : то есть один двоеточие

  2. .+ имеется в виду один или несколько символов. (+ означает один или несколько.)

  3. то есть один пробел

  4. \( то есть один открытый паренс

  5. . имеется в виду любой из символов

  6. [^)]* означает ноль или более любого символа, кроме близких паренов. (* означает ноль или больше.)

  7. $ означая конец строки.

Проблема заключалась в шаге 5, который может соответствовать ), В пересмотренном регулярном выражении это было устранено и [^)]* был заменен на [^)]+,

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