grep не работает как положено

Я пытаюсь понять, как grep решил использовать $ в качестве регулярного выражения или в качестве символа для поиска. Мои результаты показывают, что grep непоследовательно решает, что означает $.

Таким образом, я сделал простой пример:

$ cat testfile
$illy
$unset

Здесь я хочу посмотреть, смогу ли я взять строку, оканчивающуюся на "illy", используя регулярное выражение:

$ grep 'illy$' testfile
$illy

Кажется, что это работает, и это интерпретирует критерий "illy $" как $, являющийся регулярным выражением, чтобы сказать "соответствует этому выражению в конце строки". Теперь я думаю, что grep интерпретирует $ как критерий регулярного выражения, а не как строку. Так что если я хотел попробовать grep для $ illy, то это не должно совпадать ни с чем, потому что он интерпретирует $ как регулярное выражение.

Тем не мение:

$ grep '$illy' testfile
$illy

Почему он находит эту строку? Это доказывает, что даже grep не знает, как интерпретировать символ $. Не говоря уже о себе, пытаюсь это понять.

1 ответ

Решение

grep по умолчанию используются базовые регулярные выражения (BRE) и $ это специальный символ в BRE только в конце выражения.

Если ты хочешь grep чтобы обработать шаблон как расширенное регулярное выражение, используйте -E вариант

-E, --extended-regexp
              Interpret PATTERN as an extended regular  expression  (ERE,  see
              below).

-

pilot6@Pilot6:~$ grep '$illy' test
$illy
pilot6@Pilot6:~$ grep -E '$illy' test
pilot6@Pilot6:~$

pilot6@Pilot6:~$ grep 'illy$' test
$illy
pilot6@Pilot6:~$ grep -E 'illy$' test
$illy
Другие вопросы по тегам