Я пытаюсь использовать 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[^ ]*"
кажется, работает. С другой стороны, кто-то может объяснить, почему дополнительные подстановочные знаки необходимы?
Опция -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
Вам не нужно указывать .
для текущего каталога там.