Perl нежадный regex соответствие больше, чем он должен

Примечание: Этот ответ устанавливает из того же репозитория, которые используют, чтобы быть по www.debian-multimedia.org, но теперь переименовал его домен на www.deb-multimedia.org. Для получения дополнительной информации о том, почему это произошло (и почему этот репозиторий больше не считают частью Debian), посмотрите - http://lists.alioth.debian.org/pipermail/pkg-multimedia-maintainers/2012-May/026678.html

Я выполняю Jessie, вот то, как я заставляю читателя Adobe работать. Процесс должен быть очень похожим для Хрипящего. Я не вижу потребности загрузить с веб-сайта Adobe, как acroread пакет из http://www.deb-multimedia.org/ может все еще работать хорошо.

Соответствующее sources.list строка:

deb http://www.deb-multimedia.org testing main non-free

Можно заменить testing с stable для Хрипящего. Названные дистрибутивы т.е. jessie или wheezy в порядке также. Оба main и non-free компоненты необходимы начиная с один из acroreadзависимости acroread-debian-files который находится в main. Вместо того, чтобы использовать /etc/apt/sources.list файл, я на самом деле использую отдельный файл в /etc/apt/sources.list.d каталог - /etc/apt/sources.list.d/deb-multimedia.list. Вот тот от команды для создания файла (может быть, копируют/вставляют в терминал):

echo 'deb http://www.deb-multimedia.org testing main non-free' |
  sudo tee /etc/apt/sources.list.d/deb-multimedia.list

Если Вы не хотите использовать какой-либо из других пакетов репозитория www.debian-multimedia.org, можно отдать более низкий приоритет, чем пакеты Debian того же имени путем добавления следующих строк к вершине /etc/apt/preferences:

Package: *
Pin: release a=testing, o=Unofficial Multimedia Packages
Pin-Priority: 120

Снова testing может быть подкачан для stable здесь или названные дистрибутивы могут использоваться с n=jessie или n=wheezy.

Для создания www.debian-multimedia.org надежным источником можно установить его пакет брелока для ключей:

sudo apt-get update && sudo apt-get install deb-multimedia-keyring

Если Вы работаете 64-разрядный, Вы, возможно, должны добавить i386 архитектура как Adobe в настоящее время не делает 64-разрядных сборок Читателя для Linux. Проверять если i386 архитектура была уже добавлена, можно сделать:

dpkg --print-foreign-architectures

И добавить его:

sudo dpkg --add-architecture i386

Установка так же проста как:

sudo apt-get update && sudo apt-get install acroread

Теперь проблема, которую я имею с выполнением acroread эта ошибка:

/usr/lib/Adobe/Reader9/Reader/intellinux/bin/acroread: error while loading shared libraries: libGL.so.1: cannot open shared object file: No such file or directory

Один способ обойти это состоит в том, чтобы использовать следующий сценарий для выполнения acroread:

#!/bin/sh

LD_LIBRARY_PATH=/usr/lib/mesa-diverted/i386-linux-gnu /usr/bin/acroread

Если Вы вставляете это /usr/local/bin (который появляется прежде /usr/bin в значении по умолчанию PATH), сценарий возьмет приоритет над фактическим acroread двоичный файл. Это должно зафиксировать рабочего Читателя из командной строки и из меню.

Для тех, кто не удобное добавление сценария (или кто просто хочет быстрый способ сделать это), можно скопировать и вставить следующее в терминал для добавления фиксации:

echo '#!/bin/sh

LD_LIBRARY_PATH=/usr/lib/mesa-diverted/i386-linux-gnu /usr/bin/acroread' >acroread

sudo install acroread /usr/local/bin
rm acroread

Альтернативное обходное решение должно сделать то, что предлагается здесь - http://forums.solydxk.com/viewtopic.php?f=7&t=1754:

cd /usr/lib/i386-linux-gnu
sudo ln -s /usr/lib/mesa-diverted/i386-linux-gnu/libGL.so.1 libGL.so.1

Это, может быть более оптимальный вариант, если Вы хотите попытаться заставить плагин браузера работать, хотя /usr/local/bin должно быть менее навязчивым и легче помнить и удалить, когда это больше не требуется.

2
31.07.2017, 22:21
2 ответа

Я думаю, что проблема в том, что вы использовали USERADD

NOT AddUser

AddUser AddUser

Пожалуйста, проверьте это http://ubuntuforums.org/showthread.php?t=2240340

-12240340 121628-

Я упростил вашу входную строку в QABXBCZABXBCDEFW , где

A represents [
B represents -
C represents ]
D represents {\+
E represents the text between the +s (including the URL)
F represents \+}
Lower case letters represent everything else.

Итак, вот несколько замеменных команд, выполняемых на входе:

                                  Command                          Output
0. Input text:                                                     qABxBCzABxBCDEFw
1. Non-greedy:                   's|AB.*?BCD(E)F|\1|'              qEw
2. Greedy:                       's|AB.*BCD(E)F|\1|'               qEw
3. Restricted Non-greedy:        's|AB[^B]*?BCD(E)F|\1|'           qABxBCzEw
4. Restricted Greedy:            's|AB[^B]*BCD(E)F|\1|'            qABxBCzEw
5. Constrained Non-greedy:       's|(.*)AB.*?BCD(E)F|\1\2|'        qABxBCzEw
6. Constrained Greedy:           's|(.*)AB.*BCD(E)F|\1\2|'         qABxBCzEw

Команда 1 - это тот, который вы пробовали. Команда 2 - это то же самое, но не жадно. Как вы знаете, они дают тот же результат.

Мне кажется, что не жадные относится только к длине текста, сопоставленного чем-то вроде . * . Это не влияет на начальную точку. Regex совпадает всегда, как только они могут. Итак, когда вы говорите AB. *? BC (I.e., \ [-. *? - \] ), Это соответствует [- на линии. Тогда вы ожидаете, что это соответствует кратчайшему пути любых персонажей, заканчивающихся -] . Вы можете ожидать, что это будет [- (-] . Но посмотрите ближе: Regex AB. *? BCD (E) F , так что он должен соответствовать кратчайшему строку любого персонажа, заканчивающихся с -] {+ . Это заставляет его потреблять все почти до URL.

Я написал четыре альтернативных команда, которые, кажется, делают то, что вы хотите. Поиск «Ограниченные» (3 и 4) поиск, а не для AB. * BC , Но для ab [^ b] * BC ; На словах AB ... BC NO B в «...». В вашем случае, это означает [- ... -] без - в «...». «Ограниченные» (5 и 6) усиливают AB. * BC совпадение Настолько позже, положив жадную . * перед ними. Оказывается не важно, делать ли вы AB. * BC Часть Так же жадным или не жадным в них.

2
27.01.2020, 22:00

Нужно использовать отрицательный поиск :

perl -pe 's|\[-((?!-\]).)*-\] {\+(\S+… https://t.co/.*)\+}|\2|' <<<$text

Проблема заключается в первом появлении совпадений [-. Тогда не жадность паттерна не дает желаемого эффекта, не имеет значения, насколько не жадным он является. При отрицательном рассмотрении можно сопоставить все, кроме строки -], тогда она совпадает только со случаем, предшествующим части {+...+}.

2
27.01.2020, 22:00

Теги

Похожие вопросы