Подтвердить что ты не робот

Использование знака звезды в grep

Я пытаюсь найти подстроку "abc" в определенном файле в linux/bash

Итак, я:

grep '*abc*' myFile

Он ничего не возвращает.

Но если я это сделаю:

grep 'abc' myFile

Он возвращает совпадения правильно.

Теперь это не проблема для меня. Но что, если я хочу grep для более сложной строки, скажем

*abc * def *

Как я могу выполнить это с помощью grep?

4b9b3361

Ответ 1

Звездочка - это просто оператор повторения, но вам нужно сказать, что вы повторяете. /*abc*/ соответствует строке, содержащей ab и ноль или более c (потому что вторая * находится на c; первая бессмысленна, потому что ей нечего повторять). Если вы хотите что-то сопоставить, вам нужно сказать .* - точка означает любой символ (в определенных рекомендациях). Если вы хотите просто совместить abc, вы можете просто сказать grep 'abc' myFile. Для вашего более сложного соответствия вам нужно использовать .* - grep 'abc.*def' myFile, который будет соответствовать строке, содержащей abc, затем def с чем-то необязательным между ними.

Обновление на основе комментария:

* в регулярном выражении не точно совпадает с * в консоли. В консоли * является частью glob construct и просто выступает в качестве подстановочного знака (например, ls *.log перечисляет все файлы, которые заканчиваются на.журнал). Однако в регулярных выражениях * является модификатором, что означает, что он применяется только к предшествующему ему персонажу или группе. Если вы хотите, чтобы * в регулярных выражениях выступал в качестве подстановочного знака, вам нужно использовать .*, как упоминалось ранее, - точка является подстановочным символом, а звезда при изменении точки означает поиск одной или нескольких точек; то есть. найдите один или несколько символов.

Ответ 2

Символ точки означает совпадение с любым символом, поэтому .* Означает ноль или более вхождений любого символа. Вы, вероятно, хотите использовать .* Вместо *.

Ответ 3

"Звездный знак" имеет смысл только в том случае, если перед ним что-то есть. Если инструмент отсутствует (grep в этом случае), можно просто рассматривать его как ошибку. Например:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

Ответ 4

Выражение, которое вы пытались, например, те, которые работают в командной строке оболочки в Linux, например, называются glob ", Выражения Glob не являются полными регулярные выражения, которые grep использует для указания строк для поиска. Здесь есть (старый, маленький) пост о различиях. Выражения glob (как в "ls *") интерпретируются самой оболочкой.

Можно перевести с глобусов на RE, но вам обычно нужно делать это в своей голове.

Ответ 5

Вы не используете регулярные выражения, поэтому ваш вариант выбора grep должен быть fgrep, который будет вести себя так, как вы ожидаете.

Ответ 6

Попробуйте grep -E для расширенной поддержки регулярных выражений

Также посмотрите:

Страница grep man

Ответ 7

Используйте grep -P - который позволяет поддерживать регулярные выражения в стиле Perl.

grep -P "abc.*def" myfile

Ответ 8

Это может быть ответ, который вы ищете:

grep abc MyFile | grep def

Единственное, что... это будет выводить строки, которые были "def" перед OR после "abc"

Ответ 9

'*' работает как модификатор для предыдущего элемента. Таким образом, 'abc * def' выполняет поиск 'ab', за которым следует 0 или более 'c, заданный' def '.

То, что вы, вероятно, хотите, это "abc. * def", который ищет "abc", за которым следует любое количество символов, за которым следует "def".

Ответ 10

Это сработало для меня:

grep ". * $ {expr}" - с двойными кавычками, перед которыми стоит точка, стандартный grep без дополнительных ключей.