Portál AbcLinuxu, 1. listopadu 2025 11:12
Protože rychle zapomínám, tak do tohohle zápisu vložím poznámky ohledně pseudoznaků v Bashy (nebo Bashi?). Půjde o víc než jenom překlad části manuálové stránky k Bashy. V manuálové stránce k Bashy najdete informace o pseudoznacích v části nazvané Pattern Matching.
* Zastupuje jakýkoli (i nulový) řetězec.? Zastupuje jeden libovolný znak.[abcde] Odpovídá přesně jeden znak z "abcde".[1-3] nebo [a-e] Odpovídá přesně jeden znak z daného rozsahu. Vše závisí na nastavení locale a proměnné LC_COLLATE.[:class:], "class" může nabývat hodnoty:
alnum Zastupuje jakýkoli alfanumerický znak (znaky abecedy a číslice).
alpha znak abecedy
ascii ASCII znak
blank přinejmenším obsahuje znak mezery a a řídící znak '\t' (horizontal tab)
cntrl netisknutelné (řídící) znaky, "cntrl" a "print" jsou disjunktní množinydigit číslice 0 až 9graph stejné jako u "print", nepatří sem ale znak mezerylower obsahuje přinejmenším (závisí to na locale) 'a' až 'z'print pouze tisknutelné znakypunct nealfanumerické znakyspace přinejmenším znak mezery a '\, '\n' (new line), '\r' (carriage return), '\t' (horizonatal tab), '\v' (vertical tab)
upper přinejmenším 'A' až 'Z'word písmena, číslice a podtržítko (_)xdigit přinejmenším písmena 'A' až 'F', 'a' až 'f' a čísla '0' až '9'
Poznámky: [!neco] nebo [^neco] jsou negací [neco]. [-acf] nebo [acf-] -- chceme-li "matchnout" znak '-'. []123A] -- chceme-li "matchnout" znak ']'.
Pokud použijeme příkaz shopt -s extglob (tím povolíme extended pattern matching), dostaneme mocnější nástroje:
?(pattern1|pattern2|pattern3|pattern4...) nula nebo jeden výskyt pattern1 nebo pattern2 nebo pattern3 nebo pattern4 (...)*(pattern1|pattern2|pattern3|pattern4...) nula nebo víc výskytů daných řetězců
+(pattern1|pattern2|pattern3|pattern4...) jeden nebo víc výskytů daných řetězců
@(pattern1|pattern2|pattern3|pattern4...) Odpovídá buď řetězci pattern1, nebo pattern2, nebo pattern3, nebo patter4 (...).!(pattern1|pattern2|pattern3|pattern4...) Odpovídá čemukoli vyjma zadaných řetězců (negace).Poznámka: Znaky '\', ''' a '"' budou odstraněny. Záchovány budou jenom tehdy, jestliže jsou výstupem expanze nebo jsou "oúvozovkovány".
Tiskni
Sdílej:
To pseudo radši nebudeme moc řešit, ale myslím, že se obvykle říká spíš zástupné znaky. (Plné regulární výrazy to asi nejsou.)
Jojo
díky za připomínky.
Nejedná se o regulérní výrazy, ale o takzvané "žolíkové karty". Žolíkové znaky se týkají názvů souborů […]. Naproti tomu regulární výrazy se zaobírají obsahem (textových) souborůTo není tak úplně pravda. Regulární výrazy jsou (dovolím si zkratku) lidsky čitelným zápisem matematického modelu algoritmu pro rozpoznávání určité třídy jazyků. V teorii se obvykle omezujeme na regulární výrazy postihující regulární jazyky, dnešní perlovské i posixové regulární výrazy rozpoznávají jazyky bezkontextové, ale na tom teď nesejde. Zástupné (mně se to slovo žolíkové docela líbí, ale prostě mi nejde přes prsty) znaky jsou jejich podmnožinou a jejich rozpoznávací schopnost je menší (pamatuju si z MS-DOSu jenom otazník a hvězdičku, s tím toho člověk opravdu moc neudělal
).
Na druhý pohled se mi zdálo, že by ty zástupné znaky v bashi mohly mít sílu regulárních výrazů, ale možná nemají. No, nemám chuť, čas a ani schopnosti to dokázat, takže to nechme
Určitě se ale regulární výrazy od zástupných znaků nepoznají podle toho, nad čím operují.
for i in file-{1,4,9,12,15} ; do echo $i;done
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.