Wczoraj nad tym siedziałem, czytałem, eksperymentowałem. Odkryłem takie dziwne rzeczy:
(dygresja: w ogóle to temat jest ciekawy i wydaje mi się, że może poprawić produktywność w kilku dziedzinach)
no więc oprócz regexpów mamy coś takiego jak glob
używany do opisu ścieżek oraz plików: https://en.wikipedia.org/wiki/Glob_(programming)
jest to taki bardzo "prymitywny regexp". I wydawałoby się, że są jakieś podobieństwa ze standardowymi regexpami, ale są też różnice (i nawet konflikty!)! Przykład (i pytanie jak go rozwiązać):
Mamy 6 folderów o takiej nazwie w bash:
% ls 001 0a0 003 0a a0 111a
i teraz tak - jak ułożyć wyrażenie, które przejdzie do folderu: zawierającego 2 lub 3 znaki (i tylko tyle) na początku, oraz kończącego się na a
?
przykład:
cd ??
nie działa, bo bierze foldery 0a
lub a0
cd ?a
działa, ale znowu zawiera tylko i wyłącznie 2 znaki (a ja chcę 2 lub 3, a ten 3ci z przodu).
cd *a*
i on już nie działa (bo zawiera dowolną ilość znaków tył/przód, a środek jest na a
) - bo chce przejść albo do 0a
albo do 0a0
albo do 111a
.
cd *a
źle działa, bo zawiera dowolną ilość znaków z przodu i wychwytuje też np 111a
(a nie powinien)
natomiast w regexp standardowych jest też .
(kropka : http://regexone.com/lesson/wildcards_dot), a wtedy można zaznaczyć znak dowolny lub nic (null)
- i teoretycznie byłoby coś takiego
cd .?a
przechodzi do folderu zawierającego konkretnie 2 lub 3 znaki, oraz kończącego się na a
. Przy czym z tego co doczytałem to?
jest inaczej interpretowany w regexpach, a więc rozwiązanie chyba i tak jest niepoprawne.
nie wiem czy czegoś nie namieszałem, ale generalnie chodzi, że glob pattern to coś innego od regexpów (ma zdecydowanie mniejsze możliwości). Zauważyłem więc, że konkretny program lub język programowania muszą korzystać z regexpów (np. sed
). A jak nie korzystają, to nie można ich sensownie używać np. w bashu (bo w czystym bashu są tylko ograniczone glob patterns).