Zatímco my používáme * k označení nula nebo více předchozích znaků v grep , používáme *.c najít všechny soubory C, když je použijeme s ls příkaz jako ls *.c . Mohl by někdo říct, jak se používá * liší se v těchto dvou případech?
Přijatá odpověď:
Globing a regulární výrazy v názvech souborů shellu používají některé stejné znaky a mají podobné účely, ale máte pravdu, nejsou kompatibilní. Název souboru globbing je mnohem méně výkonný systém.
V názvu souboru globbing:
-
*znamená „nula nebo více znaků“ -
?znamená „jakýkoli jednotlivý znak“
Ale v regulárních výrazech musíte použít .* znamená „nula nebo více znaků“ a . znamená „jakýkoli jednotlivý znak“. ? znamená něco zcela jiného v regulárních výrazech:nula nebo jedna instance předchozího prvku RE.
Hranaté závorky ([] ) se zdá, že fungují stejně v obou systémech v systému, na kterém to píšu, alespoň pro jednoduché případy. To zahrnuje věci jako třídy znaků POSIX (např. [:alpha:] ). To znamená, že pokud potřebujete, aby vaše příkazy fungovaly na mnoha různých typech systémů, nedoporučuji používat nic nad rámec základních věcí, jako jsou seznamy znaků (např. [abeq] ) a možná rozsahy znaků (např. [a-c] ).
Tyto rozdíly znamenají, že tyto dva systémy jsou přímo zaměnitelné pouze v jednoduchých případech. Pokud potřebujete shodu názvů souborů s regulárními výrazy, musíte to udělat jiným způsobem. find -regex je jedna možnost. (Všimněte si, že existuje také find -name , mimochodem, který používá syntaxi glob.)