2016-05-22 16 views
0

При запуске этих команд, я получаю такой вывод:Почему эти регулярные выражения не работают должным образом?

Screenshot of Terminal

Вот команды и выход в текстовой форме:

$ cat exte 
i 
ii 
iii 
iiii 
iiiii 
iiiiii 

Это прекрасно работает:

$ egrep --color i\{4,5\} exte 
iiii 
iiiii 
iiiiii 

Я предполагаю, что он должен показывать цвет только один или два «i» строки, но в выходных цветах все:

$ egrep --color i\{1,2\} exte 

i 
ii 
iii 
iiii 
iiiii 
iiiiii 

Точно так же, я не могу видеть расширенное регулярное выражение работает здесь:

$ egrep --color i? exte 
i 
ii 
iii 
iiii 
iiiii 
iiiiii 


$ egrep --color i+ exte 
i 
ii 
iii 
iiii 
iiiii 
iiiiii 
+1

Используйте границы слова. –

+1

Jup, с i {1,2} вы получаете несколько совпадений для одной и той же строки. Поэтому либо используйте границу слова, либо используйте^i {1,2} $, поэтому он учитывает также начало и конец строки. – LukStorms

+1

, а для двух последних примеров с i + и i?, Строки содержат несколько i каждого единственного соответствия (не более или более) (?) Или (один или более) (+), поэтому все правильно, объясните, что/почему именно вы ожидаете –

ответ

1

Эта команда цвета все, потому что в файле есть, что много я '.

$ egrep --color i\{1,2\} exte 
i 
ii 
iii 
iiii 
iiiii 
iiiiii 

Возьмем, к примеру, третью строку на выходе. Вы не указали ограничение для строки, соответствующей началу строки или окончанию строки. Таким образом, он соответствует одному за другим. Итак, первые два i во второй третьей строке совпадают. Для третьего i он проверяет условие, что время также условие истинно. Таким образом, он соответствует всем.

Если вы хотите получить более четкий вывод, вы можете использовать опцию -o для всех совпадений.

-o: -

печать только совпадающая (непустая) часть согласующей линии, с каждой такой частью на отдельной строке вывода.

$ egrep --color i? exte 

A? mark в регулярном выражении grep, он соответствует нулю или одному вхождению предыдущего символа. Таким образом, он также работает как команда выше. Все i соответствуют одному для регулярного выражения.

$ egrep --color i+ exte 

Символ + означает совпадение одного или нескольких символов предыдущего символа. Таким образом, он соответствует всем i для строки за строкой для одного события.

Если вы хотите видеть выход как чистый формат, вы должны использовать опцию -o.

Смежные вопросы