Я пытаюсь найти подстроку «abc» в конкретном файле в linux / bash
Итак, я делаю:
grep '*abc*' myFile
Он ничего не возвращает.
Но если я это сделаю:
grep 'abc' myFile
Он правильно возвращает совпадения.
Теперь для меня это не проблема. Но что, если я хочу найти более сложную строку, например
*abc * def *
Как мне это сделать с помощью grep?
*
означает то же самое в grep и egrep: это квантификатор, означающий ноль или более предшествующих атомов. Это совершенно другая концепция, чем подстановочные знаки, используемые оболочкой.Ответы:
Звездочка - это просто оператор повторения , но вам нужно указать ему, что вы повторяете.
/*abc*/
соответствует строке, содержащей ab и ноль или более c (потому что вторая * находится на c; первая бессмысленна, потому что ей нечего повторять). Если вы хотите сопоставить что-либо, вам нужно сказать.*
- точка означает любой символ (в рамках определенных правил ). Если вы хотите просто сопоставить abc, вы можете просто сказатьgrep 'abc' myFile
. Для более сложного соответствия вам необходимо использовать.*
-grep 'abc.*def' myFile
будет соответствовать строке, содержащей abc, за которой следует def с чем-то, необязательно между ними.Обновление на основе комментария:
*
в регулярном выражении не совсем то же самое, что * в консоли. В консоли * является частью конструкции glob и просто действует как подстановочный знак (напримерls *.log
, перечислит все файлы, которые заканчиваются на .log). Однако в регулярных выражениях * является модификатором, что означает, что он применяется только к предшествующему ему символу или группе. Если вы хотите, чтобы * в регулярных выражениях действовал как подстановочный знак, вам необходимо использовать,.*
как упоминалось ранее: точка является подстановочным знаком, а звездочка при изменении точки означает поиск одной или нескольких точек; т.е. найти одного или нескольких персонажей.источник
*
означает «0 или больше», а grep по умолчанию является жадным. Обратите внимание , что в Grep основных регулярных выражений метасимволы?
,+
,{
,|
,(
, и)
теряют особый смысл. Более подробная информация: grep regexpsТочка означает совпадение с любым символом, т.е.
.*
означает ноль или более вхождений любого символа. Вы, вероятно, хотите использовать,.*
а не просто*
.источник
«Знак зодиака» имеет значение, только если перед ним что-то есть. Если инструмента нет (в данном случае grep), это может просто обработать его как ошибку. Например:
'*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz
источник
Используйте команду grep -P - которая включает поддержку регулярных выражений в стиле Perl.
grep -P "abc.*def" myfile
источник
Выражение, которое вы пробовали, как и те, которые работают, например, в командной строке оболочки в Linux, называется « glob ». Выражения Glob не являются полноценными регулярными выражениями , которые grep использует для указания строк, которые нужно искать. Вот (старый, небольшой) пост о различиях. Выражения glob (например, "ls *") интерпретируются самой оболочкой.
Переводить из глобусов в RE можно, но обычно это нужно делать в уме.
источник
Вы не используете регулярные выражения, поэтому вам следует выбрать вариант grep
fgrep
, который будет вести себя так, как вы ожидаете.источник
fgrep
теперь устарел,grep -f
следует использовать вместо него.Попробуйте grep -E для расширенной поддержки регулярных выражений
Также обратите внимание на:
Справочная страница grep
источник
Это может быть ответ, который вы ищете:
Единственное, что ... он будет выводить строки, в которых "def" стоит перед OR после "abc"
источник
Это сработало для меня:
grep ". * $ {expr}" - в двойных кавычках, которым предшествует точка. Где «expr» - это любая строка, которая вам нужна в конце строки.
Стандартный unix grep без дополнительных ключей.
источник
'*' работает как модификатор для предыдущего элемента. Таким образом, "abc * def" ищет "ab", за которым следует 0 или более "c", за которыми следует "def".
Вам, вероятно, понадобится «abc. * Def», который ищет «abc», за которым следует любое количество символов, за которым следует «def».
источник