Как найти определенный раздел тега в файле XML?

Используйте приведенную ниже команду, и она точно решит проблему:

# sudo rmmod floppy
# echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
# update-initramfs -u -k all

Перезагрузка...

4
21.05.2021, 13:01
4 ответа

Для ясности:

Это, скорее всего, работа для какого-то инструмента, который понимает XML-документы, а не grepили тому подобного. На это есть хорошие ответы.


Возможно:

grep

Использование perl -регулярное выражение и другие дополнения.

grep -Pzo "(?s)\N*<key name='enabled'.*<\/key>\n" the_file.xml

Или немного более ограниченный (Не захватываются начальные пробелы):

grep -zo "<key name='enabled'.*<\/key>."

awk

awk '
/<key name='\''enabled'\''/ { p=1 }
p { print $0 }
p && /<\/key>/ { exit }
' the_file.xml

Или

awk "/<key name='enabled'/,/<\/key>/" the_file.xml

sed

sed -n '/<key name='\''enabled'\''/,/<\/key>/p' the_file.xml
6
28.07.2021, 11:30

Если вы предполагаете, что файл содержит правильный XML, вы можете использовать xmllintиз пакета libxml2-utilsи найти нужный элемент XML с помощью выражения XPath:

    $ xmllint --xpath "/schemalist/schema/key[@name='enabled' and @type='b']" /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml 
    <key name="enabled" type="b">
          <summary>Enable remote access to the desktop</summary>
          <description>
          If true, allows remote access to the desktop via the RFB
          protocol. Users on remote machines may then connect to the
          desktop using a VNC viewer.
          </description>
          <default>false</default>
        </key>
3
28.07.2021, 11:30

Другой способ получить желаемый результат — использовать XSL (eXtensible Stylesheet Language )и xsltproc-, которые устанавливаются по умолчанию, если вы используете рабочий стол GNOME -для преобразования входного документа в желаемый вид. задокументируйте (вывод.)

Вот таблица стилей:

$ cat transform.xsl
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' omit-xml-declaration='yes' />

<xsl:template match="/schemalist/schema/key[@name='enabled']">
    <xsl:copy-of select="." />
</xsl:template>

<xsl:template match='text()|@*'/>

</xsl:stylesheet>

Вот результат:

$ xsltproc transform.xsl input.xml
<key name="enabled" type="b">
      <summary>Enable remote access to the desktop</summary>
      <description>
      If true, allows remote access to the desktop via the RFB
      protocol. Users on remote machines may then connect to the
      desktop using a VNC viewer.
      </description>
      <default>false</default>
    </key>
$
2
28.07.2021, 11:30

Использование Perl:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use XML::LibXML;

my $filename='/home/emmmcl01/gschema.xml';
my $dom = XML::LibXML->load_xml(location => $filename);
foreach my $key ($dom->findnodes('/schemalist/schema/key')) {
  my $desc = $key->findvalue('./description');
  my $nm = $key->findvalue('./@name');

  if ('enabled' eq $nm ) {
   print $key;
  }
}

Это решение выполняет итерацию по каждому элементу ключа, и когда оно находит ключ, имеющий описание, атрибут «named» которого равен «enabled», оно распечатывает элемент. Решение использует синтаксический анализатор Perl XML :XML ::LibXML, который, возможно, придется установить.

2
28.07.2021, 11:30

Теги

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