Используя grep для нахождения всех подстрок строк, которые могут содержать специальные символы

Я пытаюсь использовать grep для нахождения строки "crk" в файле. Я знаю, что строка существует в c исходном файле в форме

kop.crk_op = CRK_MOD_EXP;

Однако, когда я ищу использование

 grep -rnw --include '*.c' '.' -e "crk"

Я получаю пустой результат. Строка

 grep -rnw --include '*.c' '.' -e "crk_op"

работает просто великолепно, но это действительно не полезно мне. Я принимаю '_', символ так или иначе портит мой поиск. Как я могу изменить свой подход для соответствия всем строкам, из которых "crk" является подстрокой, даже когда '_' символ присутствует, или какой-либо другой символ в этом отношении?

Править: Кажется, что я получил немного триггера, счастливого на этом сообщении. Команда

grep -rnw --include '*.c' '.' -e "[^ ]*crk[^ ]*"

кажется, работает. С другой стороны, кто-то может объяснить, почему дополнительные подстановочные знаки необходимы?

2
задан 5 April 2017 в 08:31

1 ответ

Опция -w заставляет grep искать слова, поэтому она будет отображать crk в окружении несловесных символов. Из man grep :

-w, --word-regexp
      Select  only  those  lines  containing  matches  that form whole
      words.  The test is that the matching substring must  either  be
      at  the  beginning  of  the  line,  or  preceded  by  a non-word
      constituent character.  Similarly, it must be either at the  end
      of  the  line  or  followed by a non-word constituent character.
      Word-constituent  characters  are  letters,  digits,   and   the
      underscore.

_ является символом слова, поэтому crk_op не будет совпадать crk с -w.

Свернутое регулярное выражение "[^ ]*crk[^ ]*" работает, потому что оно допускает любое количество непробельных символов между границами слова, которое требуется grep.

Просто сделайте:

grep -rn --include '*.c' . -e crk

Вам не нужно указывать . для текущего каталога там.

3
ответ дан 2 December 2019 в 02:47

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

Похожие вопросы: