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.)