Использование знака звезды в grep
Я пытаюсь найти подстроку "abc" в определенном файле в linux/bash
Итак, я:
grep '*abc*' myFile
Он ничего не возвращает.
Но если я это сделаю:
grep 'abc' myFile
Он возвращает совпадения правильно.
Теперь это не проблема для меня. Но что, если я хочу grep для более сложной строки, скажем
*abc * def *
Как я могу выполнить это с помощью grep?
Ответы
Ответ 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 без дополнительных ключей.