#regex #linux #bash #find #regex-greedy
#регулярное выражение #linux #bash #Найти #регулярное выражение -жадное
Вопрос:
-
Кто-нибудь может привести несколько примеров использования
find -name "pattern"
команды, особенно с"pattern"
s, где используется ‘?‘ как часть регулярного выражения. Поскольку мои шаблоны совпадают с онлайн-регулярными выражениями, bit не работает в утилите ‘find’. -
Кто-нибудь может объяснить, что это значит в руководстве по поиску с примерами?
Метасимволы (
*',
?’, и[]') match a
.’ в начале базового имени (это изменение в findutils-4.2.2; см. раздел СООТВЕТСТВИЕ СТАНДАРТАМ ниже)
- Как правильно использовать
"?"
вfind -name "pattern"
? Я прав, что"?"
означает «ноль или один символ»?
Ответ №1:
Со find
справочной страницы:
-в основе имени файла лежит шаблон name (путь с удаленными ведущими каталогами), соответствующий шаблону shell pattern.
Ответом на ваш вопрос является определение термина шаблон оболочки, который объясняется здесь (вы также найдете объяснение на странице руководства вашей оболочки):
* Соответствует нулю или более символов.
? Соответствует любому символу.
[строка] Соответствует ровно одному символу, который является членом строки string. Это называется символьным классом. В качестве сокращения строка может содержать диапазоны, состоящие из двух символов с тире между ними. Например, класс ‘[a-z0-9_]’ соответствует строчной букве, цифре или символу подчеркивания. Вы можете отменить класс, поместив ‘!’ или ‘^’ сразу после открывающей скобки. Таким образом, ‘[^A-Z @]’ соответствует любому символу, кроме заглавной буквы или знака at.
Удаляет специальное значение символа, который следует за ним. Это работает даже в символьных классах.
Примеры:
Я надеюсь, что следующие примеры объясняют разницу между ?
и *
.
touch foobar
touch fobar
# * matches the tail (finds 'foobar')
find -name 'foo*'
# * matches the head (finds both files)
find -name '*bar'
# ? matches the 'f' at start (finds 'foobar')
find -name '?oobar'
# ? DON'T matches the whole tail (finds nothing)
find -name 'foo?'
# ? matches the second 'o' (finds 'foobar')
find -name 'fo?bar'
# ? matches one instance of any character after the 'f' (finds 'fobar')
find -name 'f?bar'
# * matches both zero or more characters after 'o' (finds both files)
find -name 'fo*bar'
В этом примере показано, как использовать оператор скобок [string]
:
touch fobar
touch fubar
# matches a single 'o' OR 'u' (finds both files)
find -name 'f[ou]bar'
Конечно, вы можете смешивать различные метасимволы:
# Finds every file starting with an 'o' or 'u' (included files named 'o' or 'u')
find -name '[ou]*'
# Finds every file starting with an 'o' or 'u' (excluded files named 'o' or 'u')
find -name '[ou]?*'
Комментарии:
1. Для ясности,
fo*bar
совпаденияfo
, за которыми следует ноль или более символов любого вида, за которыми следуетbar
. Это*
не связано с предыдущимo
, как и в регулярном выражении.2. Спасибо за разъяснение @chepner. Я отредактировал эту часть, чтобы сделать ее более понятной.
Ответ №2:
-
один пример:
[root@v3 ~]# find -name ‘op?n *.sh’
./openerp-install.sh
[root@v3 ~]# find -name ‘op?en*.sh’
[root@v3 ~]#
-
базовое имя — это имя файла без указания пути, например, если полный путь к файлу «/usr/share/pkgconfig/gnome-icon-theme.pc», то базовым именем этого файла будет «gnome-icon-theme.pc»
- «?» в шаблоне поиска означает «ровно один символ», а не «ноль или один символ»