Я думал, что * означает ноль или более символов или классов, предшествующих ему в базовом или расширенном регулярном выражении. Почему echo hello| grep '*llo'
потерпеть неудачу, но echo hello |egrep '*llo'
добиться успеха?
При использовании grep / egrep / fgrep вы можете включить -o
флаг, чтобы grep возвращал только совпавшие символы. (если у вас красивый цветной терминал, вы также можете попробовать --color
чтобы выделить совпадение в возвращаемых строках. В таких случаях это часто помогает.
echo "that star " | grep -o '*count'
echo "that star " | egrep -o '*count'
echo "that star " | fgrep -o '*count'
echo "that star counted" | grep -o '*count'
echo "that star counted" | egrep -o '*count' ## returns "count"
echo "that star counted" | fgrep -o '*count'
echo "that star *counted" | grep -o '*count' ## returns "*count"
echo "that star *counted" | egrep -o '*count' ## returns "count"
echo "that star *counted" | fgrep -o '*count' ## returns "*count"
Без комментариев ничего не вернули.
Таким образом, разница в том, что старые парсеры grep и fgrep, когда они не видели символа или набора перед звездочкой, предпочитали рассматривать его как нормальный символ для сопоставления. egrep рассматривает его как неработающий или недействительный и продолжает молча.
(еще одно замечание, я иногда использую pcregrep для совместимости с регулярными выражениями Perl, и на самом деле он выдает сообщение об ошибке, когда регулярное выражение начинается со звездочки!)
http://www.regular-expressions.info/repeat.html
http://www.robelle.com/smugbook/regexpr.html
В регулярных выражениях звездочка используется для поиска шаблона символа, предшествующего, а не предшествующего.
Другими словами, вы должны сказать echo hello | grep 'llo*'
чтобы найти «llo» или «lloooo» и т. д., чтобы сопоставить больше букв в шаблоне, заключите его в круглые скобки. (llo) * найдет llo, llollo и т. д.
Я предполагаю, что grep с * не работает, потому что это недопустимое регулярное выражение, а egrep просто игнорирует *.