Как или почему использование `. *?` Лучше, чем `. *`?

** Обновление 2045/09/21 **

  • Новые ссылки для пакетов mutter

Чтобы установить Catalyst 15.7 на Kali 2.0, мы должны быть очень осторожны. Я постараюсь вкратце объяснить, куда устанавливается драйвер.

Прежде всего, мы знаем, что Kali 2.0 основан на Debian 8, поэтому, когда X-сервер начинает загружать модули драйвера, он делает это в каталоге /usr/lib. В Debian это происходит следующим образом.

Когда запускается сценарий установки Catalyst, он определяет архитектуру нашего компьютера и ищет следующие папки в следующем порядке: Если архитектура x86_x64, то будет искать каталог /usr/lib64, если каталог не существует, то использует /usr/lib для установки. Нечто подобное происходит и с архитектурой i386.

В Kali есть обе директории, /usr/lib и /usr/lib64. Ранее упоминалось, что Kali основан на Debian, поэтому в Kali X-сервер будет загружать модули драйвера из каталога /usr/lib, но поскольку в Kali также есть каталог /usr/lib64, при установке Catalyst он будет установлен в каталог /usr/lib64, а не в /usr/lib, куда он должен быть установлен.

Чтобы исправить вышеуказанную проблему, нам нужно переименовать каталоги /usr/lib64 и /usr/x86_64-linux-gnu, добавив точку перед именем, это приведет к тому, что каталоги будут скрыты, и поэтому скрипт установки не найдет их и вместо этого будет использовать /usr/lib для установки драйвера.

Выполните следующие команды для успешной установки.

Сначала мы переименуем каталоги:

mv /usr/lib64 /usr/.lib64

mv /usr/x86_64-linux-gnu /usr/.x86_64-linux-gnu

Поскольку в Kali установлено ядро 4.0, нам потребуется патчить Catalyst, чтобы он работал с этой версией ядра, но мы можем сэкономить этот шаг, скачав следующий пакет, уже пропатченный для меня.

AMD Catalyst 15.7

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

apt-get install gcc g++ make dkms fakeroot

После загрузки Catalyst, мы должны распаковать его. В папке, куда вы распаковали Catalyst, откроем терминал и выполним следующие команды:

cd Setup-Experimental

mkdir /lib/modules/4.0.0-kali1-amd64/build/include/linux

cp /usr/include/linux/version. h /lib/modules/4.0.0-kali1-amd64/build/include/linux/

sh ati-installer.sh 15.20 --install

После установки драйвера появится запрос о необходимости перезагрузки компьютера. Выберите "нет".

Теперь нам нужно создать конфигурационный файл для X-сервера, поэтому выполните следующую команду:

aticonfig --initial

Примечание: Если вам нужно использовать различные опции с командой aticonfig, пожалуйста, прочитайте справку к ней, выполнив в терминале следующую команду:

aticonfig --help

По умолчанию Kali поставляется с GNOME, поэтому нам нужно выполнить следующие шаги, если мы хотим, чтобы GNOME работал правильно.

К сожалению, Catalyst имеет некоторые проблемы совместимости с GNOME, поэтому, чтобы исправить ситуацию, мы должны выполнить в терминале следующие команды:

echo "export COGL_DRIVER=gl" >> /etc/environment

echo "export COGL_OVERRIDE_GL_VERSION=1.4" >> /etc/environment

echo "export COGL_RENDERER=GLX" >> /etc/environment

echo "export LD_PRELOAD=/usr/lib/fglrx/fglrx-libGL.so.1.2" >> /etc/environment

Предыдущие команды помогают mutter определить версию OpenGL, с этим проблема с GDM решена.

Теперь нам нужно помочь mutter определить версию OpenGL, чтобы наша сессия GNOME могла правильно загружаться. Для этого выполните в терминале следующие команды:

echo "export COGL_DRIVER=gl" > ~/.xsession

echo "export COGL_OVERRIDE_GL_VERSION=1.4" >> ~/.xsession

echo "export COGL_RENDERER=GLX" >> ~/.xsession

echo "export LD_PRELOAD=/usr/lib/fglrx/fglrx-libGL.so.1.2" >> ~/.xsession

echo "gnome-session" >> ~/.xsession

Только для пользователей ноутбуков GNOME.

В ноутбуках крах gnome-shell, причина краха - X-ошибка утверждения аргументов XRRChangeOutputProperty, вызываемых из mutter-3.14.4/src/backends/x11/meta-monitor-manager-xrandr.c:output_set_presentation_xrandr

Чтобы исправить эту ошибку, необходимо перекомпилировать "mutter" с исходниками патча. Для пользователей архитектуры amd64 можно избавить себя от этой работы, скачав следующие файлы, которые скомпилировал и упаковал сам.

gir1.2-mutter-3.0_3.14.4-1~deb8u1_amd64.deb

libmutter-dev_3.14.4-1~deb8u1_amd64.deb

libmutter0e_3.14.4-1~deb8u1_amd64.deb

mutter_3.14.4-1~deb8u1_amd64.deb

mutter-common_3. 14.4-1~deb8u1_all.deb

mutter-dbg_3.14.4-1~deb8u1_amd64.deb

Для пользователей архитектуры i386, скоро я выложу скомпилированные и упакованные пакеты, так что следите за этим руководством.

Для установки пакетов необходимо открыть терминал в папке, куда вы скачали пакеты, и выполнить следующую команду:

sudo dpkg -i *.deb

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

sudo apt-get -...f install

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

В терминале выполните следующие команды:

mv /usr/.lib64 /usr/lib64

mv /usr/.x86_64-linux-gnu /usr/x86_64-linux-gnu

И с этим мы закончили. Теперь нам осталось перезагрузить компьютер, чтобы насладиться Catalyst 15.7.

9
05.05.2018, 12:26
2 ответа

Предположим, я беру строку типа:

can cats eat plants?

Использование жадного оператора c.*sбудет соответствовать всей строке, поскольку она начинается с cи заканчивается s, будучи жадным оператором, он продолжает соответствовать до последнего вхождения s.

В то время как использование ленивого c.*?sбудет соответствовать только до тех пор, пока не будет найдено первое вхождение s, то есть строка can cats.

Из приведенного выше примера вы можете понять, что:

"Жадный" означает соответствие максимально длинной строке. «Ленивый» означает сопоставление самой короткой строки. Добавление ?к квантификатору, такому как *, +, ?или {n,m}, делает его ленивым.

10
27.01.2020, 20:05

Строка может быть сопоставлена ​​несколькими способами (от простого к более сложному):

  1. В виде статической строки (Предположим, что var='Hello World!'):

    [ "$var" = "Hello World!" ] && echo yes
    echo "$var" | grep -F "Hello"
    grep -F "Hello" <<<"$var"

  2. Как шарик:

    echo./*#список все файлы в pwd.
    case $var in (*Worl*) echo yes;; (*) echo no;; esac
    [[ "$var" == *"Worl"* ]] && echo yes

    Существуют базовые и расширенные подстановки. В примере caseиспользуются базовые подстановки. В примере bash [[используются расширенные подстановочные знаки. Первое сопоставление файлов может быть базовым или расширенным в какой-либо оболочке, например параметром extglobв bash. Оба в данном случае идентичны. Grep не может использовать globs.

    Звездочка в глобусе означает нечто иное, чем звездочка в регулярном выражении:

    * matches any number (including none) ofлюбые символы .
    * matches any number (including none) of theпредшествующий элемент .

  3. В качестве базового регулярного выражения (BRE):

    echo "$var" | sed 's/W.*d//'#print :Здравствуйте!
    grep -o 'W.*d' <<<"$var"#print World !

    В (базовых )оболочках или awk нет BRE.

  4. Расширенные регулярные выражения (ERE):

    [[ "$var" =~ (H.*l) ]]#совпадение :Hello World
    echo "$var" | sed -E 's/(d|o)//g'#print :Hell Wrl!
    awk '/W.*d/{print $1}' <<<"$var"#печать :Привет
    grep -oE 'H.*l' <<<"$var"#печать :Hello World

  5. Perl-совместимые регулярные выражения:

    grep -oP 'H.*?l#печать :Хел

Только в PCRE *?имеет определенное синтаксическое значение.
Это делает звездочку ленивой (нежадной):Лень вместо жадности .

$ grep -oP 'e.*l' <<<"$var"
ello Worl

$ grep -oP 'e.*?l' <<<"$var"
el

Это только верхушка айсберга, есть жадные, ленивые и послушные или притяжательные . Существуют также просмотр вперед и назад , но они не применяются к звездочке *.

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

$ grep -o 'e[^o]*o' <<<"$var"
ello

Идея очень проста :не используйте точку ., инвертируйте следующий символ для соответствия [^o]. С веб-тегом:

$ grep -o '<[^>]*>' <<<'<script type="text/javascript">document.write(5 + 6);</script>'
<script type="text/javascript">
</script>

Вышеизложенное должно полностью прояснить все комментарии @Bob 3. Перефразируя:

  • А. *— обычное регулярное выражение, а не глобус.
  • Только регулярное выражение может быть совместимо с PCRE.
  • В PCRE :a ? изменить квантификатор *. .*жадный .*?нет.

Вопросы

  • Каковы различия в использовании. ? против.. ?

    • Значение .*?допустимо только в синтаксисе PCRE.
    • A .*более портативный.
    • Тот же эффект, что и при не-жадном сопоставлении, можно получить, заменив точку диапазоном отрицательных символов:[^a]*
  • Что лучше и при каких обстоятельствах? Пожалуйста, приведите примеры.
    Лучше? Это зависит от цели. Лучшего нет, каждый полезен для разных целей. Я привел несколько примеров выше. Вам нужно больше?

1
27.01.2020, 20:05

Теги

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