Повторний регулярний вираз чи підстановка?


12

Документація Fedora говорить:

5.2. Розширені пошукові запити

Якщо ви не знаєте назву пакета, використовуйте пошук або надайте варіанти. Крім того, використовуйте підказки або регулярні вирази з будь-яким варіантом пошуку, щоб розширити критерії пошуку.

Ну, спочатку я подумав, що це просто неправильно або застаріло, оскільки жоден відомий синтаксис регулярних виразів не працюватиме yum search, але потім я виявив таке : yum search [cl-*]наприклад. Але це робить щось потойбічне. Він знаходить речі, у яких в назві чи описі немає літер "c" та "l". (Я хотів - знайти всі пакунки, назви яких відповідатимуть cl-.*regexp.

Я також знайшов небагато людей, які пропонують підказати результати yum grep, що, звичайно, вирішує проблему. Але, просто в принципі, я хочу з’ясувати, що зробила річ у квадратних дужках. Що робити, якщо yumнасправді можна шукати за допомогою regexp?

Відповіді:


13

пошук за допомогою YUM

Зазвичай ви не використовуєте регулярних виразів (глобусів) під час пошуку, 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або, як би воно не називалося. Це звичайна мова (по відношенню до Чомського), але ми зазвичай кажемо, що щось є регулярним виразом, якщо воно визначає граматику для звичайної мови (використовуючи принаймні три основні операції: конкатенація, зміна та зірка Клейна).
wvxvw

@wvxvw - це правильно. Ви почали з термінологічного регексу, і я просто нахилився до нього 8-).
slm

3

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

У будь-якому випадку, лише перевіривши ще раз, єдиний спосіб фактично ефективно шукати за допомогою шуму - yum search all | grep fooце yum search fooдає досить нечіткі результати. Але yum list "foo-*"працює так, як очікувалося, і лише результатом у вашому випадку буде, ймовірно, пакет cl-asdf.noarch.

Швидкий погляд на пов’язані з ними бугрепорти 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

Також є кілька корисних прикладів на сторінці man внизу "Параметри списку". Додаткова документація також доступна безпосередньо на течі 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.