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, fpo którym inastępuje zero lub więcej lznakó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 grepotrzyma 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*odpowiedzifile.