Звездочка, не работающая с grep

Я искал ki с * согласно примеру ниже и это должно было возвратить первые три строки. Я не уверен, почему это возвращает последнюю строку, когда существует нет ki соответствие ему.

$ grep "ki*" trial_file.txt
kartik,27,Bangalore,Karnataka
pulkit,25,Bangalore,Karnataka
kit,28,Bangalore,Karnataka
kush,24,Pennsylvania,Philadelphia
4
задан 19 September 2017 в 12:55

2 ответа

Я думаю, что Вы ожидаете подстановочные знаки стиля оболочки здесь, но что Вы получаете, регулярное выражение. При поиске ki* Вы просите литерал k сопровождаемый 0 или больше i с.

первая строка не содержит "ki" также.

, Как сделать, это правильно зависит от того, чему точно Вы пытаетесь соответствовать.

, Как прокомментировано выше grep "ki" мог быть тем, что Вы хотите, или если бы Вы хотите соответствовать только строкам, запускающимся с "ki", Вам было бы нужно grep "^ki".
^ обозначает начало строки.

10
ответ дан 23 November 2019 в 11:35

Не использовать * для этого. Использовать grep 'ki' trial_file.txt или grep -F 'ki' trial_file.txt.

  1. Если Вы не передаете его -x/--line-regex опция, grep возвратит строки, которые содержат соответствие где угодно, даже если целая строка не является соответствием. Таким образом, все, что необходимо сделать, соответствовать части строки. Вы не должны делать ничего специального, чтобы указать, что может быть больше символов.

  2. В регулярном выражении, * означает "нуль или больше предыдущего объекта". Это - совершенно другое от его значения в расширении пути оболочки (см. также эту статью, man 7 glob, и этот раздел). Так, например:

    • ax*b соответствия a, сопровождаемый любым количеством xes (даже ни один), сопровождаемый b: ab, axb, axxb, axxxb, ...
    • a[xz]*b соответствия a сопровождаемый любым количеством символов, где каждый x или z, сопровождаемый b: ab, axb, azb, axxb, axzb, azxb, azzb, axxxb, ...
    • a(xyz)*b соответствия a, сопровождаемый нуль или больше случаев строки xyz, сопровождаемый b: ab, axyzb, axyzxyzb, axyzxyzxyzb, ...

В этом случае кажется, что Вы просто ищете текст. Вы не должны использовать метасимволы регулярного выражения как ., *, или \ это имеет особые значения. Вот почему я предлагаю передать -F флаг, который делает grep поиск "фиксированных строк" вместо того, чтобы выполнить соответствие регулярного выражения.

Если, однако, Вы только хотите соответствовать запуску в начале строки, то Вы действительно хотите использовать метасимвол регулярного выражения: ^, поскольку mjb2kmn предлагает. Это привязывает Ваше соответствие к запуску строки. В этом случае Вы работали бы grep '^ki' trial_file.txt.

Для получения дополнительной информации об опциях grep поддержки, посмотрите man grep и руководство Grep GNU.

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

11
ответ дан 23 November 2019 в 11:35

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

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