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


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

Так я и делаю:

grep '*abc*' myFile

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

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

grep 'abc' myFile

он возвращает матчи правильно.

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

*abc * def *

как бы я это сделал с помощью grep?

10 53

10 ответов:

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

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

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

символ точки означает любой символ, поэтому.* означает ноль или более любых символов. Вы, наверное, хотите использовать '.*' а не просто '*'.

Ах, черт,

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

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

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

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

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

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

grep -P "abc.*def" myfile

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

Смотрите также:

страница руководства grep

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

grep abc MyFile | grep def

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

'* ' работает как модификатор для предыдущего элемента. Поиск азбуки*деф 'на 'АБ' следуют 0 или более 'ц'за 'деф'.

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

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

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