Группа, соответствующая grep, включает дополнительные символы

Форумы Ubuntu в настоящее время снижаются, но существует поток, там названный: AMD Radeon 7470M. В том потоке кто-то задал следующий вопрос:

Question:   Has anybody successfully run linux on a laptop with a AMD 
            Radeon HD 7470M?
Background: HP Pavilion dv7 with and AMD Radeon HD 7470M graf card

На который кто-то ответил, что они смогли использовать Linux Mint успешно с теми аппаратными средствами.

Также на форумах Linux Mint был этот названный поток: Установка Графического драйвера AMD Radeon. В этом потоке пользователь сообщил, что они смогли использовать "бета" версию драйверов Катализатора, и они хорошо работали.

У меня также есть видеокарта Radeon от ATI (а именно, 7470M). Я загрузил lastest стабильный драйвер и бету один. Я закончил тем, что использовал бета драйвер, так как он работает беспрепятственно по сравнению со СТАБИЛЬНЫМ, кто буквально завинтил мой дисплей, пока я не удалил его и установил бета драйвер.

Если Вы переходите к веб-сайту AMD, можно найти "бета" драйверы доступными здесь на странице названный: Бета драйвер AMD Catalyst™ 13.6 LINUX. Статья датирована 29.05.2013 и является статьей #: RN-LN-B13.6.

3
18.01.2015, 23:06
2 ответа

Короче говоря:

\K

заставляет Grep сохранить все до к \ K и не включать его в матч. Это не влияет на то, что приходит после \ k () .

Это может быть достаточно:

" \K(.+)(?= )"

где (? =) - не захватывающая группа.

Или, возможно, лучше:

" \K([^ ]+)(?= )"
" \K(\w+)(?= )"

или подобное.

5
27.01.2020, 21:12

Это было трудно, потому что все было там. После перезагрузки системы в /usr/lib по какой-то причине появился libudev.a . У меня в системе было две версии конфигурации пакета (не уверен, как это произошло) и ./configure для hidapi использовал неправильную версию.

Это было решено путем добавления этого пути к /root/.bashrc :

export LD_LIBRARY_PATH=/usr/local/lib
-121--230078-

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

sed 's/ *\(\([^ ]*\) *\)\{[num]\}.*/\2/'

... или в качестве ERE для тех sed , которые поддерживают его, таких как версии GNU и BSD:

sed -E 's/ *(([^ ]*) *){[num]}.*/\2/p'

... любое выражение начнет свое совпадение с первым символом [num] -й группы (где [num] - положительное целое число) из [^] * символов без пробела в шаблоне-пространстве и продолжит совпадение до конца строки.

Важно, однако, то, что некоторые подгруппы соответствуют друг другу:

  • (([^] *) *) {[num]} - эта группа соответствует большему количеству [num] вхождений групп без пробелов и любых/всех последующих символов пробелов и может быть обратной ссылкой как \1 .
    • {[num]} - когда образец сопоставляется \{ [num]\} раз единственная ссылка на него, которая остается последней - и, даже если эта группа совпадает с указанным количеством вхождений образца, возвращается только последняя ссылка.
  • ([^] *) - подгруппа указанной выше группы, однако, соответствует только подмножеству символов без пробела, соответствующих \1 . На эту подгруппу можно ссылаться в \2 .
  • * и . * - совпадает с любыми/всеми символами пробела, ведущими образцами космоса, и любыми/всеми символами после вхождений, совпадающих во вложенных выражениях.
  • /\2/ - все вышеперечисленное заменяется только группой, указанной в \2 .

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

Для вашего примера:

for n in 1 2 3 4
do  echo "abc def ghi" | 
    sed -E "s/ *(([^ ]*) *){$n}.*/\2/"
done | sed -n l

... отпечатки...

abc$
def$
ghi$
$

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

sed -En 's/ *(([^ ]*) *){[num]}.*/\2/;/./p'

Принимая это немного дальше, подстановка может быть применена глобально, чтобы получить только каждый [число] раз. И поскольку * довольно ограниченно, я сделаю это с [[: Космос:]] * - что будет соответствовать любому из < пробел > < tab > < newline > < вертикальная вкладка > < return > .

s=
{   printf "${s:=$(printf '\r\v\t%10s')}"
    seq -s"$s" 100
} | sed -En "s/[${s:=[:space:]}]*(([^$s]*)[$s]*){21}/\2\\
/g;      /[^$s]/s/\n*$//p"

Перед применением sed к нему вышеуказанный printf...; seq... бит печатает одну строку, например:

\r\v\t          1\r\v\t          2\r\v\t          3\r\v\t...

... и так далее. Но применение к нему вышеуказанного sed получает вместо этого:

21
42
63
84

... и никакие пробелы не следуют за напечатанными цифрами.

2
27.01.2020, 21:12

Теги

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