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