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
Что пошло не так
Давайте посмотрим на оригинальное регулярное выражение, /:.+ \(.[^)]*$/
, один шаг за раз:
:
то есть один двоеточие.+
имеется в виду один или несколько символов. (+
означает один или несколько.)то есть один пробел
\(
то есть один открытый паренс.
имеется в виду любой из символов[^)]*
означает ноль или более любого символа, кроме близких паренов. (*
означает ноль или больше.)$
означая конец строки.
Проблема заключалась в шаге 5, который может соответствовать )
, В пересмотренном регулярном выражении это было устранено и [^)]*
был заменен на [^)]+
,