Регулярное выражение Ruby, Bash или Grep не работает для '?' то есть 0 или 1 вхождение предыдущего символа - PullRequest
0 голосов
/ 08 января 2019

Linux Red Hat Enterprise Linux Server версии 6.9 (Сантьяго)

Проблема:
У меня есть 2 задания Jenkins, и они оба вызывают другую обычную / повторно используемую работу вниз по течению (которая использует регулярное выражение для выбора своей скорости вращения). Фактический код написан на Ruby (где я использовал ::Dir.glob("<pattern>",''), и он не работал для выбора правильного имени rpm (без каких-либо ошибок), но здесь я просто сосредоточился на части регулярных выражений.

В job1 , в моей рабочей области я вижу myrpm.rpm и myrpm-extra.rpm.

В job2 в моей рабочей области я вижу myrpm-3.0.0.1027-2018_12_21_121519.noarch.rpm и myrpm-extra-3.0.0.1027-2018_12_21_121519.noarch.rpm оборотов, которые я получаю после загрузки этих файлов из Artifactory через некоторый AQL.

После того, как rpms загружены из Aritfactory, то есть доступны в рабочей области Jenkins, я использую это обычное нижестоящее задание, чтобы выбрать нужную мне скорость, используя "${rpmname}*.rpm" регулярное выражение.

Проблема в том, что когда я передаю значение параметра rpmname как " myrpm ", логика выбирает myrpm-extra.rpm Job1 ) или myrpm-extra-3.0.0.1027-2018_12_21_121519.noarch.rpm ( Job2 ) вместо правильного (не лишнего), поскольку порядок символов - на первом месте из-за последовательности ASCII.

Я протестировал регулярное выражение и увидел, почему в последней команде я не увидел ожидаемого результата. Разве 1? в регулярном выражении не даст нам какие-либо строки, которые имеют arun с 0 or 1 вхождением символа 1?

[giga@linux-server giga]# echo -e "arun\narun1\narun2\narun11" |grep "arun"
arun
arun1
arun2
arun11
[giga@linux-server giga]#

[giga@linux-server giga]# echo -e "arun\narun1\narun2\narun11" |grep "arun1"
arun1
arun11
[giga@linux-server giga]#

[giga@linux-server giga]# echo -e "arun\narun1\narun2\narun11" |grep "arun1?"
[giga@linux-server giga]#

Вопросы:
1. Почему это работает, если я использую egrep?
2. Почему он не работает с grep, а справочная страница / примеры grep говорит, что это поддерживает?
3. Какое регулярное выражение я могу использовать, чтобы, если я передал myrpm в качестве значения параметра задания, он работал как в Job1, так и в Job2, где имя файла rpm содержит либо короткое, либо полное имя rpm.

Здесь: https://www.cyberciti.biz/faq/grep-regular-expressions/ (поиск оператор регулярных выражений grep ) и

man grep показывает:

   Repetition
       A regular expression may be followed by one of several repetition operators:
       ---------------------------------------------------------------
       ?      The preceding item is optional and matched at most once.
       ---------------------------------------------------------------  
       *      The preceding item will be matched zero or more times.
       +      The preceding item will be matched one or more times.
       {n}    The preceding item is matched exactly n times.
       {n,}   The preceding item is matched n or more times.
       {,m}   The preceding item is matched at most m times.  This is a GNU extension.
       {n,m}  The preceding item is matched at least n times, but not more than m times.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Финал Решение: Использовал этот шаблон регулярного выражения: ${package_name}(?:-[0-9]*)?\..*rpm, пример кода (в Ruby) показан ниже.

В Ruby: после перехода в каталог, где существовал rpms, я получил эту строку, чтобы найти правильное имя rpm. ПРИМЕЧАНИЕ: В Ruby ::Dir.glob("<pattern>",..) - это , а не настоящий шаблон REGEX , это просто шаблон оболочки SHELL.

  wildcard = "#{new_resource.session['package_name']}(?:-[0-9]*)?\..*#{ext_type}"
rpmfullname = Dir["#{new_resource.session['package_name']}*.#{ext_type}"].select { |f| f =~ /#{wildcard}/ }.sort.first

Этот сайт очень помог. https://rubular.com/ пример шаблона myrpm(?:-[0-9]*)?\..*rpm: и строки теста, такие как:

myrpm.rpm
myrpm-extra.rpm
myrpm-1.0.0_112233.noarch.rpm
myrpm-11.0.0_112233.noarch.rpm
myrpm-111.0.0_112233.noarch.rpm
myrpm-1.0_112233.noarch.rpm
myrpm-extra-1.0.0_112233.noarch.rpm
foo.yum
berayan.rpm
arun.yum
Toni.rpm
myrpm-1.0.0_112233.rpm
0 голосов
/ 08 января 2019

egrep - это то же самое, что и grep -E, в вашем случае используется regex, для поддержки ? необходимо -E или -P.

Поиск другой regex поддержки, пожалуйста. Есть POSIX, Extended, Perl и т. Д.

Ресурсы:
Базовые и расширенные регулярные выражения POSIX
Регулярные выражения Perl
Регулярное выражение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...