Нормальное выражение или поиск по шаблону?


11

Документация Fedora гласит:

5.2. Расширенный поиск

Если вы не знаете название пакета, воспользуйтесь поиском или опциями. В качестве альтернативы можно использовать подстановочные знаки или регулярные выражения с любой опцией поиска yum, чтобы расширить критерии поиска.

Ну, сначала я подумал, что это просто неправильно или устарело, поскольку никакой синтаксис регулярных выражений работать не будет yum search, но потом я нашел это : yum search [cl-*]например. Но это делает что-то потустороннее. Он находит вещи, которые не имеют ни букв "c", ни "l" в имени или описании. (То, что я хотел, это найти все пакеты, имена которых будут совпадать с cl-.*регулярным выражением.

Я также нашел немного людей, предлагающих передать результаты yum grep, что, конечно, решает проблему. Но, в принципе, я хочу выяснить, что сделала вещь в квадратных скобках. Что если на yumсамом деле можно искать по регулярному выражению?

Ответы:


12

поиск с YUM

Обычно при поиске вы не используете регулярные выражения (globs), yum searchтак как команда searchуже ищет подстроки в именах пакетов и их резюме. Откуда я это знаю? Там есть сообщение, которое говорит вам об этом, когда вы используете yum search.

Только имена и краткие совпадения, используйте «поиск всех» для всего.

ПРИМЕЧАНИЕ . [cl-*]Технически строка является оболочкой Bash.

Таким образом, вы обычно ищете фрагменты строк, которые вы хотите с search. Регулярные выражения вступают в игру, когда вы ищете конкретные пакеты. Это команды YUM, такие как listи install.

Например:
$ yum list cl-* | expand
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.dmacc.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.dmacc.net
Available Packages
cl-asdf.noarch                  20101028-5.fc19                 fedora          
cl-clx.noarch                   0.7.4-4.3                       home_zhonghuaren
cl-ppcre.noarch                 2.0.3-3.3                       home_zhonghuaren

Единственное предостережение, с которым вы должны быть осторожны при использовании регулярных выражений / глобусов, - это если в вашей оболочке есть файлы с такими именами, что они тоже будут совпадать cl-*. В этих случаях ваша оболочка расширит регулярное выражение / глобус до того, как оно будет представлено YUM.

Поэтому вместо запуска yum list cl-*вы будете запускать команду yum list cl-file, если есть файл, соответствующий регулярному выражению / glob cl-*.

Например:
$ ls cl-file
cl-file

$ yum list cl-*
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.steadfast.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.steadfast.net
Error: No matching Packages to list

Вы можете защититься от этого, избегая подстановочного знака следующим образом:

$ yum list cl-\* | expand
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.dmacc.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.dmacc.net
Available Packages
cl-asdf.noarch                  20101028-5.fc19                 fedora          
cl-clx.noarch                   0.7.4-4.3                       home_zhonghuaren
cl-ppcre.noarch                 2.0.3-3.3                       home_zhonghuaren

Так что насчет скобок

Я подозреваю, что у вас есть файлы в вашем локальном каталоге, которые сопоставляются, когда вы используете [cl-*]в качестве аргумента yum search. Эти файлы после сопоставления с оболочкой были переданы yum searchкоманде, где совпадения были найдены.

Например:
$ ls cl-file
cl-file

$ yum search cl-*
Loaded plugins: fastestmirror, langpacks, refresh-packagekit, tsflags
Loading mirror speeds from cached hostfile
 * fedora: mirror.dmacc.net
 * rpmfusion-free: mirror.nexcess.net
 * rpmfusion-free-updates: mirror.nexcess.net
 * rpmfusion-nonfree: mirror.nexcess.net
 * rpmfusion-nonfree-updates: mirror.nexcess.net
 * updates: mirror.dmacc.net
======================================================================= N/S matched: cl-file =======================================================================
opencl-filesystem.noarch : OpenCL filesystem layout

  Name and summary matches only, use "search all" for everything.

ПРИМЕЧАНИЕ. Приведенное выше совпадение сопоставлялось с именем моего файла, cl-fileа не с тем, cl-*что я планировал.


Ооо, теперь я вижу. Ну, это объясняет это. Одно замечание придирки, хотя cl-*и не является регулярным выражением, оно globназывается или как оно называется. Это обычный язык (в терминах Chomskian), но мы обычно говорим, что что-то является регулярным выражением, если оно определяет грамматику для обычного языка (используя по крайней мере три основных операции: конкатенация, изменение и звезда Клини).
wvxvw

@wvxvw - это правильно. Вы начали с регулярного выражения терминологии, и я просто использовал его 8-).
СЛМ

3

Определенно другая версия yum, использующая RHEL 6.5 здесь с yum 3.2.29. Осторожно:
вы должны заключить в кавычки *, чтобы не совпадать с чем-либо в текущем каталоге с помощью разбивки оболочки ... Для получения дополнительной информации об этом и практическом примере см. Следующий ответ: /unix//a/155157/83329

В любом случае, только что проверил еще раз, единственный способ на самом деле эффективно искать с помощью поиска yum - yum search all | grep fooэто yum search fooдавать довольно размытые результаты. Но yum list "foo-*"работает так, как ожидалось, и единственным результатом в вашем случае, вероятно, будет пакет cl-asdf.noarch.

У быстрого поиска связанных сообщений об ошибках yum у поиска yum есть и другие недостатки: https://bugs.launchpad.net/percona-server/+bug/580336/comments/2


1

Извините, я не могу комментировать, поэтому придется использовать ответ.

Ты пробовал yum search cl-*или yum list 'cl-*'? По крайней мере, yum whatprovides */fooэто работает для поиска имен файлов, хотя это немного особый случай. В противном случае я также часто использую,
yum list all | grep -i fooно остерегайтесь многострочного вывода yum, grep может показывать только первую строку, поэтому, возможно, используйтеyum list all | grep -iA1 foo

Есть также несколько полезных примеров на странице руководства ниже «Опции списка». Дополнительная документация также доступна непосредственно в апстриме по адресу http://yum.baseurl.org/, например, http://yum.baseurl.org/wiki/YumCommands или, возможно, напрямую через python: http://yum.baseurl.org/wiki/ YumCodeSnippet / YumSearch


Я пробовал yum search cl-*? - да. Это ничего не находит (может быть, другая версия ням? Я все еще использую FC18).
wvxvw

Что ж, из прочтения предполагаемого варианта использования для yum search, комбинирование его с регулярными выражениями / подстановочными знаками является двойным избыточным. yum searchуже выполняет нечеткий поиск, поэтому использование групповых символов довольно бесполезно. Если вы хотите ограничить свой поиск, используйте yum list expressionили yum list all | grep expression. В противном случае я предлагаю вам открыть запрос на улучшение против yum - удачи вам: p
doktor5000
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.