Grep испортил мое понимание - PullRequest
       8

Grep испортил мое понимание

0 голосов
/ 17 сентября 2011

Некоторое время я пытался поиграть с grep, чтобы извлечь данные из файлов, и заметил кое-что забавное.

Это может быть мое невежество, но вот что происходит ...

Предположим, у меня есть файл ABC. данные:

a
abc
ab
bac
bb
ac

Теперь запустил эту команду grep,

grep a* ABC

Я обнаружил, что вывод содержит строки, начинающиеся с b.c. почему это происходит?

Ответы [ 4 ]

2 голосов
/ 17 сентября 2011

Вы использовали «a *» в качестве шаблона поиска ... «*» означает ноль или БОЛЕЕ предыдущего символа, поэтому «bc» соответствует, имея в нуле или более «a».

На полусвязанной ноте я бы рекомендовал процитировать бит «a *», поскольку, если в текущем подкаталоге есть ЛЮБЫЕ файлы, начинающиеся с a, вы ОЧЕНЬ удивитесь, увидев, что вы действительно ищете,поскольку оболочка (bash, zsh, csh, sh, dash, wtfsh ...) автоматически выполнит раскрытие подстановочного знака ДО выполнения команды.

, если вы хотите найти строки, которые начинаются с 'a',затем вам нужно будет привязать шаблон поиска к начальному символу ^, чтобы ваш шаблон стал '^ a *', но, опять же, * означает ноль или более, так что это бесполезно в этой ситуации, когда у вас есть только одна буква... вместо этого используйте '^ a'.

В качестве надуманного примера, если вы хотите найти все строки, содержащие 'c', и строки, содержащие буквы 'bc', то вы можете использовать 'b * c'как шаблон поиска ... означает ноль или более б, а с.

Сила паттерна поиска регулярных выражений огромна и требует некоторого времени для поиска.Просмотрите man-страницы для grep (1), regex (7), pcre (3), pcresyntax (3), pcrepattern (3).

Как только вы освоите их, регулярные выражения полезны в sed,grep, perl, vim, (возможно, тоже emacs), ... э-э, уже поздно (рано?) больше ничего не приходит на ум, но они ОЧЕНЬ мощные.

Как бонус, '*' означаетНоль или больше, «+» означает ОДИН или больше, а «?»означает НОЛЬ или ОДИН.

Так что искать вещи с двумя или более а '...' аа + ', что составляет 1 а, и 1+ а (1 или более)

Я бродю.... (регулярное выражение (7)!)

1 голос
/ 17 сентября 2011

grep пытается найти этот шаблон во всей строке. Используйте ^a, чтобы получить строку, начинающуюся с a или ^a*$, чтобы найти строки, содержащие только a s (включая пустую строку).

также, пожалуйста, укажите этот аргумент оболочки (например: '^a*$'), если вы используете a* и в рабочем каталоге есть файл, начинающийся с a, вы получите очень странные результаты ...

0 голосов
/ 17 сентября 2011

Вы должны поместить кавычки вокруг вашего шаблона:

grep "a*" ABC

В противном случае * интерпретируется оболочкой (которая выполняет сопоставление имени файла с подстановочными знаками), а не самим grep.

0 голосов
/ 17 сентября 2011

Попробуйте, у меня все работает.^ означает начало строки - поэтому он должен начинаться с a.

grep ^a ABC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...