Как извлечь только часть одной строки?

Это могло быть из-за ошибки модуля DRM ядра, это было зафиксировано. Я не могу сказать из того отчета, какое ядро фиксация была добавлена к - пробуют последний, Вы можете - но на основе патча это не имеет значения так или иначе; это - просто поддельное предупреждение.

Таким образом, если Вы не замечаете ничто больше неправильно, и это не уходит с последним ядром, доступным в 12,04, не волнуйтесь об этом. Не отставайте от обновлений, и это будет, вероятно, скоро включено.

2
28.02.2015, 19:47
4 ответа

С помощью GNU grep, связанного с последней версией библиотеки PCRE (Perl Compatible Regular Expressions), можно попробовать:

$ grep -oP '<essid\b[^<>]*>\K[^<>]*(?=</essid>)' file
WLAN-123651234

Это извлечет содержимое тега essid.

Объяснение:

  • точно совпадает со строкой

  • \b, называемой границей слова, которая совпадает между символом слова и не-словесным символом, наоборот.

  • [^<>]* отрицательный класс символов, который соответствует любому символу, но не < или >, нулю или более раз.

  • \K отбрасывает все ранее совпадающие символы из печати в конце.

  • [^<>]* отрицательный класс символов, который соответствует любому символу, но не < или >, нулю или более раз.

  • (?=) Положительное утверждение, которое утверждает, что за совпадением должна следовать строка .

4
27.01.2020, 21:50

Почему вы используете grep, чтобы достать вещи из xml-файлов? Вы используете grep, так что вы, вероятно, на Linux или BSD системе, так почему бы не использовать вместо этого xpath из командной строки?

xpath -q -e "SSID/essid/text()" /path/to/file.xml

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

Если он не установлен, ваш менеджер пакетов должен быть в состоянии позаботиться об этом. В Ubuntu соответствующий пакет называется libxml-xpath-perl.

4
27.01.2020, 21:50

с GNU GREP:

grep -oP 'essid.*>\K.*(?=<)' file

Выход:

WLAN-123651234
2
27.01.2020, 21:50

Риск звучания как неработающая запись - 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.

1
27.01.2020, 21:50

Теги

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