Я нашел echo file|grep fil*
неудачи, но все echo abcd|grep abc*
получилось.
Я не понимаю, кто-то может объяснить?
Я нашел echo file|grep fil*
неудачи, но все echo abcd|grep abc*
получилось.
Я не понимаю, кто-то может объяснить?
Ответы:
В вашем примере есть две проблемы.
Основным из них является то, что вы предполагаете, что регулярные выражения работают так же, как шаблоны glob, в которых *
используется подстановочный знак, означающий «любая последовательность символов». В регулярных выражениях *
вместо этого означает «любое число предыдущего атома», поэтому fil*
означает, что f
за ним i
следует ноль или более l
символов. Вы должны сказать, grep fil.*
чтобы получить предполагаемое значение: .
означает «любой отдельный символ, так что это .*
означает« любая последовательность символов ».
Меньшая проблема заключается в том, что вы используете специальные символы без кавычек, которые что-то значат в правилах glob, что означает, что оболочка может их интерпретировать. Если у вас есть какие-либо файлы в локальном каталоге, соответствующие шаблонам glob fil*
или abc*
, оболочка будет их расширять , поэтому grep
получит расширенные имена файлов в виде шаблона, а не предполагаемого RE. Всякий раз , когда вы используете такие символы в командной строке, вы должны процитировать их: echo file | grep 'fil.*'
.
echo file|grep fil*
ответы сfil
эл.