Znalazłem, że się echo file|grep fil*
nie udaje, ale się echo abcd|grep abc*
udaje.
Nie rozumiem tego, czy ktoś może wyjaśnić?
Znalazłem, że się echo file|grep fil*
nie udaje, ale się echo abcd|grep abc*
udaje.
Nie rozumiem tego, czy ktoś może wyjaśnić?
Odpowiedzi:
Istnieją dwa problemy z twoim przykładem.
Po pierwsze, zakładasz, że wyrażenia regularne działają tak samo jak wzorce globu, ponieważ *
jest to symbol wieloznaczny oznaczający „dowolną sekwencję znaków”. W wyrażeniach regularnych *
oznacza zamiast tego „dowolną liczbę poprzedniego atomu”, a więc fil*
oznacza, f
po którym i
następuje zero lub więcej l
znaków. Musisz powiedzieć, grep fil.*
aby uzyskać zamierzone znaczenie: .
oznacza „dowolny pojedynczy znak, co .*
oznacza„ dowolną sekwencję znaków ”.
Mniejszy problem polega na tym, że używasz niecytowanych znaków specjalnych, które oznaczają coś według reguł globalnych, co oznacza, że powłoka może je interpretować. Jeśli masz w katalogu lokalnym jakieś pliki pasujące do wzorców globu fil*
lub abc*
, powłoka je rozszerzy , więc grep
otrzyma rozwinięte nazwy plików jako wzorzec, a nie zamierzoną RE. Kiedykolwiek używasz takich znaków w wierszu poleceń, należy je zacytować: echo file | grep 'fil.*'
.
echo file|grep fil*
odpowiedzifil
e.