Это могло быть из-за ошибки модуля DRM ядра, это было зафиксировано. Я не могу сказать из того отчета, какое ядро фиксация была добавлена к - пробуют последний, Вы можете - но на основе патча это не имеет значения так или иначе; это - просто поддельное предупреждение.
Таким образом, если Вы не замечаете ничто больше неправильно, и это не уходит с последним ядром, доступным в 12,04, не волнуйтесь об этом. Не отставайте от обновлений, и это будет, вероятно, скоро включено.
С помощью GNU grep
, связанного с последней версией библиотеки PCRE (Perl Compatible Regular Expressions), можно попробовать:
$ grep -oP '<essid\b[^<>]*>\K[^<>]*(?=</essid>)' file
WLAN-123651234
Это извлечет содержимое тега essid
.
Объяснение:
\b
, называемой границей слова, которая совпадает между символом слова и не-словесным символом, наоборот.
[^<>]*
отрицательный класс символов, который соответствует любому символу, но не <
или >
, нулю или более раз.
\K
отбрасывает все ранее совпадающие символы из печати в конце.
[^<>]*
отрицательный класс символов, который соответствует любому символу, но не <
или >
, нулю или более раз.
(?=)
Положительное утверждение, которое утверждает, что за совпадением должна следовать строка .
Почему вы используете grep, чтобы достать вещи из xml-файлов? Вы используете grep, так что вы, вероятно, на Linux или BSD системе, так почему бы не использовать вместо этого xpath из командной строки?
xpath -q -e "SSID/essid/text()" /path/to/file.xml
Будет делать именно то, что вы хотите, и с гораздо меньшим количеством хлопот, чем регулярные выражения, которые, как правило, довольно хрупки в получении вещей из XML.
Если он не установлен, ваш менеджер пакетов должен быть в состоянии позаботиться об этом. В Ubuntu соответствующий пакет называется libxml-xpath-perl.
Риск звучания как неработающая запись - XML
- это структура данных, и с этой структурой данных можно сделать множество вещей, которые действительны в соответствии со спецификацией XML, но полностью нарушают ее в отношении регулярных выражений. Такие вещи, как форматирование строк, отступы, перенос тегов и т. Д.
Поэтому я настоятельно призываю всех - при обработке XML - использовать синтаксический анализатор XML. Они предназначены для обработки вложенности и обработки XML, которые игнорируют формат, но все же различают важную семантику, такую как теги, вложение и атрибуты.
Итак, я бы подошел к вашей проблеме следующим образом:
#!/usr/local/bin/perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new(
'twig_handlers' => {
'essid' => sub { print $_ ->text }
}
)->parse( <> );
Это выплюнет:
WLAN-123651234
И если вы хотите, чтобы у вас не было отдельного файла сценария (но я думаю, вам стоит, потому что это обычно лучше для ясности и техобслуживание) вы можете дополнительно сократить:
perl -MXML::Twig -e 'XML::Twig->new( twig_handlers => { essid => sub { print $_ -> text,"\n" } } ) -> parse ( <> );'
Для бонусных баллов - вы можете использовать выражения xml xpath, например:
essid[@cloaked="false"]
Для печати подмножества.
Также полезно - модуль XML :: Twig
поставляется с очень полезной утилитой xml_grep
, которая ... делает именно то, что вы хотите, а именно grep xml.